【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-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:

 

猜你喜欢

转载自blog.csdn.net/u011182346/article/details/83510023