题目:
幻方是把一些数字填写在方阵中,使得行、列、两条对角线的数字之和都相等。
欧洲最著名的幻方是德国数学家、画家迪勒创作的版画《忧郁》中给出的一个4阶幻方。
他把1,2,3,...16 这16个数字填写在4 x 4的方格中。
如图所示:
16 ? ? 13
? ? 11 ?
9 ? ? *
? 15 ? 1
表中有些数字已经显露出来,还有些用?和*代替。
请你计算出? 和 * 所代表的数字。并把 * 所代表的数字作为本题答案提交。
源代码:
public class HuanFang {
static boolean[] vis=new boolean[17];
public void hs(int qs,int a[])
{
int i;
if(qs==16)
{
int[] sum=new int[10];
sum[0]=a[0]+a[1]+a[2]+a[3]; //第一行
sum[1]=a[4]+a[5]+a[6]+a[7]; //第二行
sum[2]=a[8]+a[9]+a[10]+a[11]; //第三行
sum[3]=a[12]+a[13]+a[14]+a[15]; //第四行
sum[4]=a[0]+a[4]+a[8]+a[12]; //第一列
sum[5]=a[1]+a[5]+a[9]+a[13]; //第二列
sum[6]=a[2]+a[6]+a[10]+a[14]; //第三列
sum[7]=a[3]+a[7]+a[11]+a[15]; //第四列
sum[8]=a[0]+a[5]+a[10]+a[15]; //斜对角
sum[9]=a[3]+a[6]+a[9]+a[12]; //斜对角
for(i=0;i<10-1;i++)
{
if(sum[i]!=sum[i+1])
return ;
}
for(int j=0;j<16;j++) //都相等输出
{
System.out.print(a[j]+" ");
}
return ;
}
if(qs==0||qs==3||qs==6||qs==8||qs==13||qs==15)
{
hs(qs+1,a);
return ;
}
for(i=1;i<=16;i++)
{
if(i==1||i==9||i==11||i==13||i==15||i==16)
continue;
if(!vis[i])
{
vis[i]=true;
a[qs]=i;
hs(qs+1,a);
vis[i]=false; //回溯
}
}
}
public static void main(String[] args) {
// TODO 自动生成的方法存根
int[] a= new int[16];
a[0]=16;a[3]=13;a[6]=11;a[8]=9;a[13]=15;a[15]=1; //填数
vis[16]=true;vis[13]=true;vis[11]=true;vis[9]=true;vis[15]=true;vis[1]=true; //已访问过
HuanFang hf=new HuanFang();
hf.hs(0,a);
}
}