幻方是把一些数字填写在方阵中,使得行、列、两条对角线的数字之和都相等。
欧洲最著名的幻方是德国数学家、画家迪勒创作的版画《忧郁》中给出的一个4阶幻方。
他把1,2,3,…16 这16个数字填写在4 x 4的方格中。
如图p1.jpg所示,即:
16 ? ? 13
? ? 11 ?
9 ? ? *
? 15 ? 1
请你计算出? 和 * 所代表的数字。并把 * 所代表的数字作为本题答案提交。
答案是一个整数,请通过浏览器直接提交该数字。
注意:不要提交解答过程,或其它辅助说明类的内容。
参考答案:12
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <ctime>
using namespace std;
int a[10]={2,3,4,5,6,7,8,10,12,14};
int aa[4][4]={{16,0,0,13},{0,0,11,0},{9},{0,15,0,1}};
int fun()
{
int i,j;
int hsum=aa[0][0]+aa[0][1]+aa[0][2]+aa[0][3];
int lsum=aa[0][0]+aa[1][0]+aa[2][0]+aa[3][0];
int sum,sum1,sum2=0,sum3=0;
for(i=0;i<4;i++)
{
sum=0;
sum1=0;
for(j=0;j<4;j++)
{
sum+=aa[i][j];//行相加
sum1+=aa[j][i];//列相加
} sum2+=aa[i][i];//正对角相加
sum3+=aa[3-i][3-i];//反对角相加
if(sum!=hsum)
return 0;
if(sum1!=lsum)
return 0;
}
if(sum3!=sum2)
return 0;
return 1;
}
int main()
{
clock_t s,f;
int i,j;
s=clock();
do
{
aa[0][1]=a[0];
aa[0][2]=a[1];
aa[1][0]=a[2];
aa[1][1]=a[3];
aa[1][3]=a[4];
aa[2][1]=a[5];
aa[2][2]=a[6];
aa[2][3]=a[7];
aa[3][0]=a[8];
aa[3][2]=a[9];
if(fun()==1)
break;
}while(next_permutation(a,a+10));//c++全排列函数
for(i=0;i<4;i++)
{
for(j=0;j<4;j++)
printf("%-3d ",aa[i][j]);
printf("\n");
}
f=clock();
printf("用时:%lf ms",(double)(f-s));
}