魔方陣(Magic Square)又稱「縱橫圖」,是一個 n×n 矩陣,填入 1 到 n² 的自然數,每個數字唯一出現一次,且每行、每列、主對角線、副對角線的和皆相等。此常數稱為魔術常數:M = n(n²+1)/2。
malloc 分配指標陣列,再為每行分配空間memset 將所有元素歸零#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void generate_magic_square(int n) {
// 1. 分配動態二維陣列
int **square = (int**)malloc(n * sizeof(int*));
for(int i = 0; i < n; i++) {
square[i] = (int*)malloc(n * sizeof(int));
memset(square[i], 0, n * sizeof(int));
}
// 2. Siamese Method 填充
int row = 0;
int col = n / 2;
square[row][col] = 1;
for(int num = 2; num <= n * n; num++) {
int next_row = (row - 1 + n) % n; // 向上環繞
int next_col = (col + 1) % n; // 向右環繞
// 衝突檢測:目標位置已佔用,或來自右上角
if(square[next_row][next_col] != 0) {
next_row = (row + 1) % n; // 正下方
next_col = col;
}
row = next_row;
col = next_col;
square[row][col] = num;
}
// 3. 格式化輸出
for(int i = 0; i < n; i++) {
for(int j = 0; j < n; j++) {
printf("%5d", square[i][j]);
}
printf("\n");
}
// 4. 釋放記憶體
for(int i = 0; i < n; i++) {
free(square[i]);
square[i] = NULL;
}
free(square);
square = NULL;
}
int main() {
int n;
printf("請輸入奇數階數 (n): ");
if(scanf("%d", &n) != 1 || n % 2 == 0 || n < 1) {
printf("錯誤:請輸入正奇數!\n");
return 1;
}
generate_magic_square(n);
return 0;
}
17 24 1 8 15
23 5 7 14 16
4 6 13 20 22
10 12 19 21 3
11 18 25 2 9
驗證:每行/列/對角線和 = 5×(25+1)/2 = 65 ✓
奇數階魔方陣構建是經典演算法教學案例,展示了「簡單規則產生複雜結構」的之美。C語言實作中,動態記憶體管理、邊界條件處理、資源釋放規範是關鍵工程實踐點。