解题思路:
魔方阵的排列规律如下(思路来自互联网):
注意:刚开始我也没看懂,但是相信我多看几遍理解已经能看懂的。
如3×3的魔方阵:
8 1 6
3 5 7
4 9 2
(1)将1放在第一行中间一列;
(2)从2开始直到n×n止各数依次按下列规则存放;每一个数存放的行比前一个数的行数减1,列数加1(例如上面的三阶魔方阵,5在4的上一行后一列);
(3)如果上一个数的行数为1,则下一个数的行数为n(指最下一行);例如1在第一行,则2应放在最下一行,列数同样加1;
(4)当上一个数的列数为n时,下一个数的列数应为1,行数减去1。例如2在第3行最后一列,则3应放在第二行第一列;
(5)如果按上面规则确定的位置上已有数,或上一个数是第一行第n列时,则把下一个数放在上一个数的下面。例如按上面的规定,4应该放在第1行第2列,但该位置已经被占据,所以4就放在3的下面;
小编提示:
魔方阵算法:下个数的位置为上个数的位置的行减一列加一 即x-1 y+1
通过这个算法即可算出魔方阵。但是需要注意的是有几种情况是不满足的。例如:
x越界:将x置为(总行数-1)
y越界:将(y=0)
如果arr[x][y]有值了。将新的位置置为上个数的后方即arr[oldx+1][oldy];
代码如下(由小编亲自编写,有问题请联系小编微信:eyyjsxy):
#define N 15
#include "stdio.h"
int main(){
int arr[N][N] = {0};
int x=0,y,s=1,i,j,n=2,oldx,oldy;
//校验输入的是不是偶数或者是不是超过了15位
while(n%2 == 0 || n > 15){
printf("输入n的值,不能是偶数,不能超过15:");
scanf("%d",&n);
}
//计算第一行中间的列值,并将1赋值到这个位置
y=n/2;
//对其赋值并记录其位置,用于下一个数的位置判断
arr[x][y] = s;
oldx = x;
oldy = y;
//从2 到 n*n进行循环,通过上一个值的地址寻找下一个值的地址 例如通过 数字 1 所在的地址 寻找2所在的地址
for(s = 2;s <= n*n;s++){
//进行行减一列加一运算
x = oldx - 1;
y = oldy + 1;
//判断特殊情况
if(x < 0)//x越界
x = n-1; //x越界就将x的位置重置为n-1
if(y > n-1){//y越界
y = 0;//y越界就将y重置为0
}
if(arr[x][y] != 0){
//通过上面的条件判断arr[x][y]位置有数,那么就将新的数加到上个数的下面oldx + 1即可
x = oldx+1;
y = oldy;
}
printf("%d:的位置为(%d,%d):\n",s,x,y);
//经过一些列的判断,一定能得出这个数的位置,我们只需要将s赋值到这个位置即可!
//对其赋值并记录其位置,用于下一个数的位置判断
arr[x][y] = s;
oldx = x;
oldy = y;
}
//循环输出魔方阵
printf("即将输出一个%d*%d的魔方阵:\n",n,n);
for(i = 0;i < n;i++){
for(j = 0;j < n;j++){
printf("%d\t",arr[i][j]);
}
printf("\n\n");
}
return 0;
}
效果如图所示:
3*3:
5*5: