奇數(shù)魔方陣
奇數(shù)魔方陣就是將數(shù)字排列在nxn(n為奇數(shù))的方陣上,要求滿足各行、各列與各對角線的和相同。如下圖所示,是n=5的奇數(shù)魔方陣。
填魔方陣的方法以奇數(shù)魔方陣最為簡單,第一個(gè)數(shù)字放在第一行的正中央(填了1),然后向右(左)上填,如果右(左)上已有數(shù)字,則向下填,如下圖所示:
一般程序語言的陣列多由0開始,為了計(jì)算方便,我們利用索引1到n的部份,而在計(jì)算是向右(左)上或向下時(shí),我們可以將索引值除以n值,如果得到余數(shù)為1就向下,否則就往右(左)上。
#include
#include
#define N 5
int main(void) {
int i, j, key;
int square[N+1][N+1] = ;
i = 0;
j = (N+1) / 2;
for(key = 1; key
if((key % N) == 1)
i++;
else {
i--;
j++;
}
if(i == 0)
i = N;
j = 1;
square[i][j] = key;
}
for(i = 1; i
for(j = 1; j
printf("%2d ", square[i][j]);
printf(" ");
}
return 0;
}
4N 魔方陣
與奇數(shù)魔術(shù)方陣相同,在于求各行、各列與各對角線的和相等,不同的是這次方陣的維度是4的倍數(shù)。
先來看看4X4方陣的解法:
簡單的說,就是一個(gè)從左上由1依序開始填,但遇對角線不填,另一個(gè)由左上由16開始填,但只填在對角線,再將兩個(gè)合起來就是解答了。如果N大于等于2,則以 4X4為單位畫對角線,如下所示:
至于對角線的位置該如何判斷,有兩個(gè)公式,有興趣的可以畫圖印證,如下:
左上至右下:j % 4 == i % 4
右上至左下:(j % 4 + i % 4) == 1
8階魔方陣(N=2)的結(jié)果如下:
#include
#include
#define N 8
int main(void) {
int i, j;
int square[N+1][N+1] = ;
for(j = 1; j
for(i = 1; i
if(j % 4 == i % 4 || (j % 4 + i % 4) == 1)
square[i][j] = (N+1-i) * N -j + 1;
else
square[i][j] = (i - 1) * N + j;
}
}
for(i = 1; i
for(j = 1; j
printf("%2d ", square[i][j]);
printf(" ");
}
return 0;
}

