[问题]幻方又称魔方阵,游戏规则是在一一个n*n的矩阵中填入1到n2的数字,使得每一行、每一列、每条对角线的累加和都相等。如图所示是一个3阶幻方,每一行、每一列每条对角线的累加和都等于15。
[想法]解决幻方问题的方法很多,下面介绍一种“左上斜行法”的填数方法,该方法适用于任意奇数阶幻方,具体填数
过程如下:
(1)由1开始填数,将1放在第1行的中间位置;
(2)将幻方想象成上下、左右相接,每次往左上角走一一步,会有下列情况:
①左上角超出上边界,则在最下边对应的位置填入下一个数,如图(a)所示;
②左上角超出左边界,则在最右边对应的位置填入下一个数,如图 (b)所示;
③按上述方法找到的位置已填数,则在原位置的同一列下一行填入下一个数,如图 ©所示:
代码部分:
/*1.幻方问题*/
int arr[100][100]={0}; //假设最多为100行、100列
printf("请输入1-100内的奇数:\n"); //只处理为奇数的方阵
int num;
scanf("%d",&num);
int i,j;
i=0;j=num/2;
arr[i][j]=1; //将第一个值存入中间位置
int iTemp,jTemp; //用于暂存当前位置
for(int k=2;k<=num*num;k++){
iTemp=i;
jTemp=j;
if(--i<0){ //判断当前位置是否超出上边界
i=num-1;
}
if(--j<0){ //判断当前位置是否超出左边界
j=num-1;
}
if(arr[i][j]>0){ //如果该位置已经有数,则在该位置下面添加数字
i=iTemp+1;
if(i==num){
i=0;
}
j=jTemp;;
}
arr[i][j]=k;
}
for(int m=0;m<num;m++){
for(int n=0;n<num;n++){
printf("%d\t",arr[m][n]);
}
printf("\n");
}