【C语言】二维数组解魔方阵
解题思路:
魔方阵的排列规律如下(思路来自互联网):
注意:刚开始我也没看懂,但是相信我多看几遍理解已经能看懂的。
如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-1if(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:

本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
