1. 程式人生 > >【C語言】二維陣列解魔方陣

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