62.由8個整數(shù)形成奇特的立方體
任意給出8個整數(shù),將這8個整數(shù)分別放在一個立方體的八個頂點(diǎn)上,要求每個面上的四個數(shù)之和相等。
*問題分析與算法設(shè)計
簡化問題:將8個頂點(diǎn)對應(yīng)數(shù)組中的8個元素,將“每個面上的四個數(shù)之和皆相等”轉(zhuǎn)換為數(shù)組無素之間和的相等關(guān)系。這里的關(guān)鍵在于正確地將立方體的8個頂點(diǎn)與數(shù)組的8個元素對應(yīng)。
可以利用簡單的窮舉方法建立8個數(shù)的全部排列。
*程序與程序注釋
#include
#include
void main()
{
int a[9],ii=0,i,a1,a2,a3,a4,b1,b2,b3,b4,flag;
for(i=1;i<=8;i++) /*輸入個數(shù)*/
{
printf("Please enter [%d]number:",i);
scanf("%d",&a[i]);
ii+=a[i];
}
printf("******************************************\n");
if(ii%2) /*和為奇數(shù)則輸入的8個數(shù)不可用*/
{
printf("Sorry they can't be constructed required cube!\n");
exit(0);
}
for(flag=0,a1=1;a1<=8;a1++) /*flag:完成標(biāo)記.flag=1;表示完成*/
for(a2=1;a2<=8;a2++) /*采用八重循環(huán)建立八個整數(shù)的全排列*/
if(a2!=a1) /*前兩個數(shù)不能相同*/
for(a3=1;a3<=8;a3++)
if(a3!=a2&&a3!=a1) /*前三個數(shù)不能相同*/
for(a4=1;a4<=8;a4++)
if(a4!=a3&&a4!=a2&&a4!=a1) /*前四個數(shù)不能相同*/
for(b1=1;b1<=8;b1++)
if(b1!=a4&&b1!=a3&&b1!=a2&&b1!=a1) /*不能相同*/
for(b2=1;b2<=8;b2++)
if(b2!=b1&&b2!=a4&&b2!=a3&&b2!=a2&&b2!=a1)
for(b3=1;b3<=8;b3++)
if(b3!=b2&&b3!=b1&&b3!=a4&&b3!=a3&&b3!=a2&&b3!=a1)
/*不能取相同的數(shù)*/
for(b4=1;b4<=8;b4++)
if(b4!=b2&&b4!=b1&&b4!=b3&&b4!=a4&&b4!=a3&&b4!=a2&&b4!=a1)
if(a[b1]+a[b2]+a[b3]+a[b4]==ii/2
&&a[a1]+a[a2]+a[b1]+a[b2]==ii/2
&&a[a1]+a[a4]+a[b1]+a[b4]==ii/2)
{
flag=1;goto out; /*滿足條件則將flag置1后退出*/
}
out:
if(flag)
{
printf("They can be constructed required cube as follow:\n");
printf(" /%2d............/%2d\n",a[a4],a[a3]);
printf(" %2d/............%2d/|\n",a[a1],a[a2]);
printf(" | | | |\n");
printf(" | | | |\n");
printf(" | %2d| | |%2d\n",a[b4],a[b3]);
printf(" /................/\n");
printf(" %2d/.............%2d/\n",a[b1],a[b2]);
}
else printf("Sorry they can't be constructed required cube!\n");
}
*運(yùn)行結(jié)果
Please enter [1] number:20
Please enter [2] number:45
Please enter [3] number:39
Please enter [4] number:25
Please enter [5] number:29
Please enter [6] number:7
Please enter [7] number:3
Please enter [8] number:2
Sorry they can't be constructed required cube!
任意給出8個整數(shù),將這8個整數(shù)分別放在一個立方體的八個頂點(diǎn)上,要求每個面上的四個數(shù)之和相等。
*問題分析與算法設(shè)計
簡化問題:將8個頂點(diǎn)對應(yīng)數(shù)組中的8個元素,將“每個面上的四個數(shù)之和皆相等”轉(zhuǎn)換為數(shù)組無素之間和的相等關(guān)系。這里的關(guān)鍵在于正確地將立方體的8個頂點(diǎn)與數(shù)組的8個元素對應(yīng)。
可以利用簡單的窮舉方法建立8個數(shù)的全部排列。
*程序與程序注釋
#include
#include
void main()
{
int a[9],ii=0,i,a1,a2,a3,a4,b1,b2,b3,b4,flag;
for(i=1;i<=8;i++) /*輸入個數(shù)*/
{
printf("Please enter [%d]number:",i);
scanf("%d",&a[i]);
ii+=a[i];
}
printf("******************************************\n");
if(ii%2) /*和為奇數(shù)則輸入的8個數(shù)不可用*/
{
printf("Sorry they can't be constructed required cube!\n");
exit(0);
}
for(flag=0,a1=1;a1<=8;a1++) /*flag:完成標(biāo)記.flag=1;表示完成*/
for(a2=1;a2<=8;a2++) /*采用八重循環(huán)建立八個整數(shù)的全排列*/
if(a2!=a1) /*前兩個數(shù)不能相同*/
for(a3=1;a3<=8;a3++)
if(a3!=a2&&a3!=a1) /*前三個數(shù)不能相同*/
for(a4=1;a4<=8;a4++)
if(a4!=a3&&a4!=a2&&a4!=a1) /*前四個數(shù)不能相同*/
for(b1=1;b1<=8;b1++)
if(b1!=a4&&b1!=a3&&b1!=a2&&b1!=a1) /*不能相同*/
for(b2=1;b2<=8;b2++)
if(b2!=b1&&b2!=a4&&b2!=a3&&b2!=a2&&b2!=a1)
for(b3=1;b3<=8;b3++)
if(b3!=b2&&b3!=b1&&b3!=a4&&b3!=a3&&b3!=a2&&b3!=a1)
/*不能取相同的數(shù)*/
for(b4=1;b4<=8;b4++)
if(b4!=b2&&b4!=b1&&b4!=b3&&b4!=a4&&b4!=a3&&b4!=a2&&b4!=a1)
if(a[b1]+a[b2]+a[b3]+a[b4]==ii/2
&&a[a1]+a[a2]+a[b1]+a[b2]==ii/2
&&a[a1]+a[a4]+a[b1]+a[b4]==ii/2)
{
flag=1;goto out; /*滿足條件則將flag置1后退出*/
}
out:
if(flag)
{
printf("They can be constructed required cube as follow:\n");
printf(" /%2d............/%2d\n",a[a4],a[a3]);
printf(" %2d/............%2d/|\n",a[a1],a[a2]);
printf(" | | | |\n");
printf(" | | | |\n");
printf(" | %2d| | |%2d\n",a[b4],a[b3]);
printf(" /................/\n");
printf(" %2d/.............%2d/\n",a[b1],a[b2]);
}
else printf("Sorry they can't be constructed required cube!\n");
}
*運(yùn)行結(jié)果
Please enter [1] number:20
Please enter [2] number:45
Please enter [3] number:39
Please enter [4] number:25
Please enter [5] number:29
Please enter [6] number:7
Please enter [7] number:3
Please enter [8] number:2
Sorry they can't be constructed required cube!