【C語言】二維陣列解魔方陣
阿新 • • 發佈:2018-10-31
解題思路:
魔方陣的排列規律如下(思路來自網際網路):
注意:剛開始我也沒看懂,但是相信我多看幾遍理解已經能看懂的。
如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: