要求輸出1~n²的自然數構成的魔方陣。
魔方陣,古代又稱“縱橫圖”,是指組成元素為自然數1、2…n2的平方的n×n的方陣,其中每個元素值都不相等,且每行、每列以及主、副對角線上各n個元素之和都相等。
此處先寫簡單一點的奇階魔方陣,偶數階的算法更復雜,暫不討論。
奇階魔方陣的排列方法:
⑴將1放在第一行中間一列;
⑵從2開始直到n×n止各數依次按下列規則存放;每一個數存放的行比前一個數的行數減1,列數加1;
⑶如果上一個數的行數為1,則下一個數的行數為n(指最下一行);
⑷當上一個數的列數為n時,下一個數的列數應為1,行數減去1;
⑸如果按上面規則確定的位置上已有數,或上一個數是第一行第n列時,則把下一個數放在上一個數的下面。
⑴構造一個n階魔方陣雛形,即n*n的動態二維數組;
⑵編寫函數實現魔方陣的排列算法;
⑶調用函數輸出魔方陣。
malloc函數:分配內存空間給動態數組(使用後需在函數最後用free語句釋放所占用的內存)
memset函數:給數組的所有元素賦初值
-----------------------------------------華麗麗的分割線---------------------------------代碼君要出場了-----------------------------------
1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <string.h> 4 5 void f(int x); 6 7 int main() 8 { 9 int x; 10 11 scanf("%d", &x); 12 f(x); 13 14 return 0; 15 } 16 17 void f(int x) 18 { 19 int i, m, n; 20 int **mf; 21 22 mf = (int **)malloc(sizeof(int *) * x); //定義動態二維數組mf 23 24 for(i = 0; i < x; i++) 25 { 26 mf[i] = (int *)malloc(sizeof(int) * x); 27 memset(mf[i], 0, sizeof(int) * x); //初始化,將二維數組mf所有元素賦值為0 28 } 29 30 m = 0; 31 n = x / 2; 32 mf[m][n] = 1; 33 34 for(i = 2; i <= x * x; i++) 35 { 36 m--; 37 n++; 38 39 if(m < 0) //如果是在第一行,行數變為最後一行,列數加1 40 { 41 m = x - 1; 42 } 43 44 if(n > x - 1) //如果是在最後一列,行數減1,列數為第1行 45 { 46 n = 0; 47 } 48 49 if(mf[m][n] != 0) //如果後續的數所處位置已有數,則行數加1,列數不變 50 m++; 51 52 mf[m][n] = i; 53 } 54 55 for(m = 0; m < x; m++) 56 { 57 for(n = 0; n < x; n++) 58 { 59 printf("%5d", mf[m][n]); 60 } 61 62 printf("\n"); 63 } 64 65 for(i = 0; i < x; i++) //釋放占用的內存 66 { 67 free(mf[i]); 68 mf[i] = 0; 69 } 70 71 free(mf); 72 mf = 0; 73 }