如题:
幻方是把一些数字填写在方阵中,使得行、列、两条对角线的数字之和都相等。
欧洲最著名的幻方是德国数学家、画家迪勒创作的版画《忧郁》中给出的一个4阶幻方。
他把1,2,3,...16 这16个数字填写在4 x 4的方格中。
如图p1.jpg所示,即:
16 ? ? 13
? ? 11 ?
9 ? ? *
? 15 ? 1
表中有些数字已经显露出来,还有些用?和*代替。
请你计算出? 和 * 所代表的数字。并把 * 所代表的数字作为本题答案提交。
图:
用了两种方法,,不想说话了。
第一种方法C语言,代码如下:
#include <stdio.h>
int main()
{
//经过考虑,我发现了个很简单但是很困难的方法。。如下:
int a[10];//还有十个数字
for (a[0] = 2;a[0] <15;a[0]++)//现在剩余的最小数字是2,最大数字是14
{
for(a[1] = 2;a[1] <15;a[1]++)
{
for(a[2] = 2;a[2] < 15;a[2]++)
{
for(a[3] = 2;a[3] < 15;a[3]++)
{
for(a[4] = 2;a[4] <15;a[4]++)
{
for(a[5] = 2;a[5] <15;a[5]++)
{
for(a[6] = 2;a[6] <15;a[6]++)
{
for(a[7] = 2;a[7] <15;a[7]++)
{
for(a[8] = 2;a[8] <15;a[8]++)
{
for(a[9] = 2;a[9] <15;a[9]++)
{
if(//把 16+a[0]+a[1]+13作为对比数
16+a[2]+9+a[8]== 16+a[0]+a[1]+13&&
16+a[3]+a[6]+1== 16+a[0]+a[1]+13&&
13+11+a[5]+a[7]== 16+a[0]+a[1]+13&&
a[2]+a[3]+11+a[4]==16+a[0]+a[1]+13&&
9+a[5]+a[6]+a[7]== 16+a[0]+a[1]+13&&
a[8]+15+a[9]+1== 16+a[0]+a[1]+13&&
a[0]+a[3]+a[5]+15==16+a[0]+a[1]+13&&
a[1]+11+a[6]+a[9]==16+a[0]+a[1]+13&&
13+a[4]+a[7]+1== 16+a[0]+a[1]+13&&//每列每行的数都对比完了,该对比每个数了
a[0]!=a[1]&&a[0]!=a[2]&&a[0]!=a[3]&&a[0]!=a[4]&&a[0]!=a[5]&&a[0]!=a[6]&&a[0]!=a[7]&&a[0]!=a[8]&&a[0]!=a[9]&&
a[1]!=a[2]&&a[1]!=a[3]&&a[1]!=a[4]&&a[1]!=a[5]&&a[1]!=a[6]&&a[1]!=a[7]&&a[1]!=a[8]&&a[1]!=a[9]&&
a[2]!=a[3]&&a[2]!=a[4]&&a[2]!=a[5]&&a[2]!=a[6]&&a[2]!=a[7]&&a[2]!=a[8]&&a[2]!=a[9]&&
a[3]!=a[4]&&a[3]!=a[5]&&a[3]!=a[6]&&a[3]!=a[7]&&a[3]!=a[8]&&a[3]!=a[9]&&
a[4]!=a[5]&&a[4]!=a[6]&&a[4]!=a[7]&&a[4]!=a[8]&&a[4]!=a[9]&&
a[5]!=a[6]&&a[5]!=a[7]&&a[5]!=a[8]&&a[5]!=a[9]&&
a[6]!=a[7]&&a[6]!=a[8]&&a[6]!=a[9]&&
a[7]!=a[8]&&a[7]!=a[9]&&
a[8]!=a[9]
)
{
printf("%d\n", a[7]);
goto h;
}
}
}
}
}
}
}
}
}
}
h:break;
}
}
理解起来绝对非常容易的一种方法,下面,请让我们看运行代码
咦~运行代码呢?握一种植物。没有。。。因为太太太太长了,超时了。。花费了老长时间,哎。
看下面那种方法,全排列
#include<iostream>
#include<algorithm>
#include<string.h>
using namespace std;
int main()
{
int sum[10];//共有十组总和
int i,j;//备用
int a[10]={
2,3,4,5,6,7,8,10,12,14};
do
{
memset(sum,0,sizeof(sum[0]));//给这些数分配空间
sum[0]=16+a[0]+a[1]+13;
sum[1]=a[2]+a[3]+11+a[4];
sum[2]=9+a[5]+a[6]+a[7];
sum[3]=a[8]+15+a[9]+1;
sum[4]=16+a[2]+9+a[8];
sum[5]=a[0]+a[3]+a[5]+15;
sum[6]=a[1]+11+a[6]+a[9];
sum[7]=13+a[4]+a[7]+1;
sum[8]=16+a[3]+a[6]+1;
sum[9]=13+11+a[5]+a[8];
for(i=0;i<10;i++)
{
if (sum[0]!=sum[i])//既然每个数都相等,那么尝试从总和的第0个向上走
{
break;
}
i++;
}
if (i==10)
{
cout<<a[7];
break;
}
}while (next_permutation(a,a+10));//全排列(还是有点不懂)
return 0;
}
运行截图
结果是12;