本文共 1508 字,大约阅读时间需要 5 分钟。
解题思路:
魔方阵的排列规律如下(思路来自互联网):
注意:刚开始我也没看懂,但是相信我多看几遍理解已经能看懂的。
如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:
转载地址:http://xthgi.baihongyu.com/