幻方是把一些数字填写在方阵中,使得行、列、两条对角线的数字之和都相等。 欧洲最著名的幻方是德国数学家、画家迪勒创作的版画《忧郁》中给出的一个4阶幻方。
他把1,2,3,...16 这16个数字填写在4 x 4的方格中。表中有些数字已经显露出来,还有些用?和*代替。请你计算出? 和 * 所代表的数字,并把 * 所代表的数字作为本题答案提交。
16的全排列的很大,所以只要对格子中没有出现的数字进行全排列即可
STL代码:
#include<iostream>
#include<algorithm>
#include<string.h>
using namespace std;
int main()
{
int sum[10]={0},i,j;
int a[10]={2,3,4,5,6,7,8,10,12,14};
do
{
memset(sum,0,sizeof(sum));
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];
i=1;
while (i<10)
{
if (sum[0]!=sum[i])
break;
i++;
}
if (i==10)
{
cout<<a[7];
break;
}
}while (next_permutation(a,a+10));
return 0;
}