排列方法
如3×3的魔方陣:8 1 6
3 5 7
4 9 2
魔方陣的排列規律如下:
⑴將1放在第一行中間一列;
⑵從2開始直到n×n止各數依次按下列規則存放;每一個數存放的行比前一個數的行數減1,列數加1(例如上面的三階魔方陣,5在4的上一行後一列);
⑶如果上一個數的行數為1,則下一個數的行數為n(指最下一行);例如1在第一行,則2應放在最下一行,列數同樣加1;
⑷當上一個數的列數為n時,下一個數的列數應為1,行數減去1。例如2在第3行最後一列,則3應放在第二行第一列;
⑸如果按上面規則確定的位置上已有數,或上一個數是第一行第n列時,則把下一個數放在上一個數的下面。例如按上面的規定,4應該放在第1行第2列,但該位置已經被占據,所以4就放在3的下面;
簡介
⒈何謂矩陣?矩陣就是由方程組的係數及常數所構成的方陣。把用在解線性方程組上既方便,又直觀。⒉何謂n階方陣?若一個矩陣是由n個橫列與n個縱行所構成,共有n*n個小方格,則稱這個方陣是一個n階方陣。
⒊何謂魔方陣? 4 9 2 3 5 7 8 1 6定義:由n*n個數字所組成的n階方陣,具有各對角線,各橫列與縱行的數字和都相等的性質,稱為魔方陣。而這個相等的和稱為魔術數字。若填入的數字是從1到n*n,稱此種魔方陣為n階正規魔方陣。
⒋最早的魔方陣相傳古時為了幫助治水專家大禹統治天下,由水中浮出兩隻龐大動物背上各負有一圖,只有大禹才可指揮其中之由龍馬負出的為河圖,出自黃河;另一由理龜負出的洛書出自洛河。洛書
⒌最早的四階魔方陣相傳是刻在印度一所廟宇石上,年代大約是十一世紀。古代印度人十分崇拜這種幻方,至今從古神殿的遺址,墓碑上常常還可以發現四階幻方的遺蹟。
⒍歐洲最早的魔方陣是公元1514年德國畫家Albrecht Dure在他著名的銅板畫Melencolia上的4×4幻方,有趣的是,他連創造年代(1514)也鑲在這個方陣中,而且上下左右,四個小方陣的和皆為34,是歐洲最古老的幻方。
變形
⒈相異魔方陣對應方格所填的數字不相同的兩個魔方陣,如下圖16 02 03 13 01 15 04 14 05 11 10 08 12 06 09 07 09 07 06 12 13 03 16 02 04 14 15 01 08 10 05 11
⒉相等魔方陣每一個對應方格所填的數字都相同的兩個魔方陣,如下圖4 9 2 4 9 2 3 5 7 3 5 7 8 1 6 8 1 6
⒊全等魔方陣若一個魔方陣能夠經過鏇轉或鏡射的方式變成和另一個魔方陣相等,稱這兩個魔方陣全等。在計算魔方陣個數時,我們把全等的魔方陣視為同一種。2 7 6 8 3 4 9 5 1 1 5 9 4 3 8 6 7 2
4,剛性變形法⑴順時針方向鏇轉90 ⑵順時針方向鏇轉180 ⑶順時針方向鏇轉270 ⑷左右翻轉(繞鉛直對稱軸鏡射) ⑸上下翻轉(繞水平對稱軸鏡射) ⑹左上右下翻轉(繞右上至左下對角線鏡射) ⑺右上左下翻轉(繞左上至右下對角線鏡射)
原始方陣鏇轉90。鏇轉180。鏇轉270。01 03 16 14 12 08 13 01 07 05 10 12 14 04 09 07 13 15 02 04 10 06 15 03 09 11 06 08 16 02 11 05 08 06 11 09 05 11 02 16 04 02 15 13 03 15 06 10 12 10 05 07 07 09 04 14 14 16 03 01 01 13 08 12
左右翻轉上下翻轉左上右下翻轉右上左下翻轉14 16 03 01 12 10 05 07 07 09 04 14 01 13 08 12 04 02 15 13 08 06 11 09 05 11 02 16 03 15 06 10 09 11 06 08 13 15 02 04 10 06 15 03 16 02 11 05 07 05 10 12 01 03 16 14 12 08 13 01 14 04 09 07 5.加值變形法正規魔方陣:首項是1,公差是1加值變形後的魔方陣:首項是a,公差是r
原始魔方首項為5公差為1首項為5公差為2 14 16 03 01 18 20 07 05 31 35 09 05 04 02 15 13 08 06 19 17 11 07 33 29 09 11 06 08 13 15 10 12 21 25 15 19 07 05 10 12 11 09 14 16 17 13 23 27
⒍互補變形法就是將魔方陣中的每一個數字都替換成互補數的變形方式。在n階魔方陣中,數字k的互補數=(1+n*n)–k
原始魔方陣互補變形魔方陣14 16 03 01 03 01 14 16 04 02 15 13 13 15 02 04 09 11 06 08 08 06 11 09 07 05 10 12 10 12 07 05
⒎田字變形法以中心點為準將魔方陣分成四個相等的小方陣。當n為奇數時,中央的行列要獨立出來。
n是偶數時n是奇數時ABA A1 BDC? D1 E B1 D C1 C將魔方陣如下重組: CD C C1 D? BA B1 E D1 B A1 A
可參考下面的範例:原始4階魔方陣4階田字變形魔方陣原始5階魔方陣5階田字變形魔方陣01 03 16 14 11 09 08 06 18 22 01 10 14 13 17 09 21 05 13 15 02 04 05 07 12 10 04 08 12 16 25 24 03 20 07 11 08 06 11 09 16 14 01 03 15 19 23 02 06 02 06 23 15 19 12 10 05 07 02 04 13 15 21 05 09 13 17 10 14 01 18 22 07 11 20 24 03 16 25 12 04 08 8.井字對換變形法⑴任選一數k,1<=k<=n。⑵將方陣的第k行和其互補行(第n+1-k行)對換。⑶將方陣的第k列和其互補列(第n+1-k列)對換。⑷為方便稱呼,此時姑且命名為k值井字對換變形。
原始魔方陣1值井字對換魔方陣2值井字對換魔方陣1,2值井字對換魔方陣01 03 16 14 07 10 05 12 01 16 03 14 07 05 10 12 13 15 02 04 04 15 02 13 08 11 06 09 09 11 06 08 08 06 11 09 09 06 11 08 13 02 15 04 04 02 15 13 12 10 05 07 14 03 16 01 12 05 10 07 14 16 03 01 9.拓樸變形法⑴任選不相等的兩數1<=k1,k2<=n,但當(n+1)/2為奇數時,k1及k2不能等於(n+1)/2。⑵將坐標含k1值的全改成k2。含k2值的全改成k1。含n+1-k1值的全改成n+1-k2。含n+1-k2值的全改成n+1-k1。⑶為方便稱呼,此時姑且命名為k1,k2拓樸變形。
可參考下面的3階1,3拓樸變形示意圖(1,1) (1,2) (1,3) (3,3) (3,2) (3,1) (2,1) (2,2) (2,3) (2,3) (2,2) (2,1) (3,1) (3,2) (3,3) (1,3) (1,2) (1,1)
可參考下面的範例原始魔方陣1,2拓樸變形魔方陣18 22 01 10 14 08 04 12 25 16 04 08 12 16 25 22 18 01 14 10 15 19 23 02 06 19 15 23 06 02 21 05 09 13 17 11 07 20 03 24 07 11 20 24 03 05 21 09 17 13註:其實對換變形、田字變形可包含於拓樸變形中,只因想法不同故列出參考
奇數階魔方陣的建構法(又稱奇數幻方)
⒈楊輝法發明者:楊輝適用:三階魔方陣方法:九子斜排,上下對易,左右相更,四維挺進***1*** **4*2** 4 9 2 *7*5*3* 3 5 7 **8*6** 8 1 6 ***9***
楊輝法推廣-菱形法發明者:Bachet de Meziriac適用:奇數階魔方陣方法:數字斜排,上下對易,左右相更,四維挺進
********01******** ******06**02****** ****11**07**03*** * 11 24 07 20 03 **16**12**08**04** 04 12 25 08 16 21**17**13**09**05 17 05 13 21 09 **22**18* *14**10** 10 18 01 14 22 ****23**19**15**** 23 06 19 02 15 ******24**20****** * *******25********
⒉簡捷連續填製法發明者:De La Loubere適用:奇數階魔方陣方法:1立首列中,右一上一,受阻下一
* * 1 * * * * 1 * * * * 1 * * * * 1 * * * * 1 8 * 17 24 1 8 15 * * * * * * * * * * * 5 * * * * 5 * * * * 5 7 * * 23 5 7 14 16 * * * * * * * * * * 4 * * * * 4 6 * * * 4 6 * * * 4 6 13 20 22 * * * * * * * * * * * * * * 3 * * * * 3 10 * * * 3 10 12 19 21 3 * * * * * * * * 2 * * * * 2 * * * * 2 * 11 * * 2 9 11 18 25 2 9簡捷連續填製法推廣適用:奇數階魔方陣方法:⑴1立首列中,右1上1,受阻下1; ⑵1立中央上,右1下2,受阻上2; ⑶1立首行中,右2下1,受阻右1; ⑷1立首列中,右1下2,受阻下4; ⑸1立中央上,右1上1,受阻上2 ; ⑹1立首行中,左1上1,受阻右1。
⒊輔助方陣法適用:五階以上奇數階魔方陣方法:⑴製作輔助方陣一:在左上端填入1,按照走馬的方式往右二下一的方向填入1至底,接著在每列的1的右邊依序填入2、3、4…n 1 * * * * 1 2 3 4 5 1 2 3 4 5 * * 1 * * * * 1 * * 4 5 1 2 3 * * * * 1 * * * * 1 2 3 4 5 1 * 1 * * * * 1 * * * 5 1 2 3 4 * * * 1 * * * * 1 * 3 4 5 1 2 ⑵製作輔助方陣二:在左上端填入0,按照走馬的方式往右一下二的方向填入0至底,接著在每列的0的下面依序填入n、2n、3n…n(n-1) 0 * * * * 0 15 5 20 10 1 17 8 24 15 * * * 0 * 5 20 10 0 15 9 25 11 2 18 * 0 * * * 10 0 15 5 20 12 3 19 10 21 * * * * 0 15 5 20 10 0 20 6 22 13 4 * * 0 * * 20 10 0 15 5 23 14 5 16 7 ⑶將輔助方陣一與二的對應方格內之數相加填到一個新的方陣對應方格內,則新的方陣即為一個魔方陣。
⒋擴階法適用:n階魔方陣,n為大於5的正整數方法:⑴先建構出一個n-2階的魔方陣⑵將⑴所建立的魔方陣每個數字再加上2n-2 ⑶將步驟⑵的魔方陣外面再加上一圈,這一圈有4n-4個空格,填入的數為1~(2n-2)和(-2n+3)~n*n,先算出魔術數字會比較好填。
8 1 6 16 09 14 23 01 02 20 19 3 5 7 11 13 15 22 16 09 14 04 4 9 2 12 17 10 05 11 13 15 21 08 12 17 10 18 07 25 24 06 03 5.方陣合成法適用:當魔方陣的階數n可分解成兩個大於2之整數p、q的乘積方法:假設A=[(a)ij]與B=[(b)ij]分別代表m階與n階魔方陣,對每個t=1,2…m*m,令At=[(a)ij+m*m(t–1)]。接著我們將方陣B中的數t以m階魔方陣(A)t代替,就可以得到一個m. n階魔方陣。
可參考下面的範例魔方陣A魔方陣B 35 28 33 26 19 24 71 64 69 8 1 6 4 3 8 30 32 34 21 23 25 66 68 70 3 5 7 9 5 1 31 36 29 22 27 20 67 72 65 4 9 2 2 7 6 80 73 78 44 37 42 08 01 06 75 77 79 39 41 43 03 05 07 A4 A3 A8 76 81 74 40 45 38 04 09 02 A9 A5 A1 17 10 15 62 55 60 53 46 51 A2 A7 A6 12 14 16 57 59 61 48 50 52 13 18 11 58 63 56 49 54 47
偶數階魔方陣的建構法
1、楊輝法發明者:楊輝適用:4階魔方陣方法:以十六子,依次遞作四行排列,先以外四子對換,一換十六、四換十三,以四內角對換,六換十一、七換十,橫直上下斜角,皆三十四數,對換止可施之於小。01 02 03 04 16 02 03 13 16 02 03 13 05 06 07 08 05 06 07 08 05 11 10 08 09 10 11 12 09 10 11 12 09 07 06 12 13 14 15 16 04 14 15 01 04 14 15 01
楊輝法推廣-消去對角線法適用:四之倍數階魔方陣方法:⑴先將整個方陣劃分成k*k個4階方陣,然後在每個4階方陣的對角線上做記號⑵由左而右、由上而下,遇到沒有記號的位置才填數字,但不管是否填入數字,每移動一格數字都要加1 ⑶自右下角開始,由右而左、由下而上,遇到沒有數字的位置就填入數字,但每移動一格數字都要加1
⒉井字法適用:四之倍數階魔方陣方法:⑴把1~n*n從左上角依序填入方陣內⑵用兩條鉛直線和兩條水平線將方陣分隔成四個角落各有一個n/4階的子方陣,和中心位置有一個n/2階的子方陣⑶以方陣中心為對稱點,將五個子方陣的數字作對稱交換,其它的數字不要動。這樣的方陣會是一個魔方陣
01 02 03 04 16 02 03 13 05 06 07 08 05 06 07 08 09 10 11 12 09 10 11 12 13 14 15 16 04 14 15 01
⒊輔助方陣法適用:偶數階魔方陣(因非四的倍數作法相當複雜,在此只介紹四的倍數的作法)方法:⑴製作輔助方陣一:第一列由左向右排列1至n,第二列由右向左排列1至n,第三列同第二列,第四列同第一列,若超過四列,重複一至四列的作法,完成輔助方陣一⑵製作輔助方陣二:將第一個輔助方陣各方格內的數字x換成n(x-1),再做行列互換,完成輔助方陣二⑶將輔助方陣一與二的對應方格內之數相加填到一個新的方陣對應方格內,則新的方陣即為一個魔方陣01 02 03 04 00 12 12 00 01 14 15 04 04 03 02 01 04 08 08 04 08 11 10 05 04 03 02 01 08 04 04 08 12 07 06 09 01 02 03 04 12 00 00 12 13 02 03 16
⒋擴階法同奇數階之作法
⒌方陣合成法同奇數階之作法
C語言程式求魔方陣如下:(求奇數幻方)
代碼一:#include
#define N 16 //這裡可以修改N的值
int main()
{
int a[N][N]={0},i,j,k,p,m,n;
p=1;
while(p==1)
{
printf("Enter n(1~%d): ",N-1);/*可以輸入小於等於N-1的整數*/
scanf("%d",&n);
if((n!=0)&&(n
}
i=n+1;
j=n/2+1; /*建立魔方陣*/
a[1][j]=1;
for(k=2;k<=n*n;k++)
{
i=i-1;
j=j+1;
if((i<1)&&(j>n))
{
i=i+2;j=j-1;
}
else
{
if(i<1) i=n;
if(j>n) j=1;
}
if(a[i][j]==0) a[i][j]=k;
else
{
i=i+2;
j=j-1;
a[i][j]=k;
}
}
for(i=1;i<=n;i++)/*輸出魔方陣*/
{
for(j=1;j<=n;j++)
printf("%4d",a[i][j]);
}
printf("\n");
}
代碼二:(相對於代碼一條理更清晰,更簡單、更容易理解)
將1~n的平方這幾個數構成一個n階魔方陣。
算法:
依以下法則,你可以很快的寫出奇數階幻方!當然,這種寫法只是其中一個答案,而不是唯一答案。
1)將1填入第一行中間;
2)將每個數填在前一個數的右上方。
3)若該位置超出最上行,則改填在最下行的對應位置;
4)若該位置超出最右列,則該填在最左列的對應行位置;
5)若某元素填在第一行最右列,下一個數填在該數同列的下一行;
6)若某數已填好,但其右上角已填了其他數據,則下一個數填在該數同列的下一行位置。
#include
void main()
{
int a[15][15]={0},i,j,m,n,temp,M;
printf("請輸入一個3~15的奇數:\n");
scanf("%d",&M);
i=0;
j=M/2;
a[i][j]=1;
for(temp=2;temp<=M*M;temp++)
{
m=i;
n=j;
i--;
j++;
if(i<0)
i=M-1;
if(j>M-1)
j=0;
if(a[i][j]!=0)
{
i=m+1,j=n;
a[i][j]=temp;
continue;
}
a[i][j]=temp;
}
printf("%d×%d魔方陣:\n",M,M);
for(i=0;i
{
for(j=0;j
printf("%4d",a[i][j]);
printf("\n");
}
}
//(求4的倍數階幻方)
void main()
{
int i,j,x,y,n,t,k=1;
int a[100][100];
printf("請輸入魔方陣的階數n \n");
scanf("%d",&n);
printf("輸出為:\n");
if(n%4==0)
{
for(i=0;i
for(j=0;j
{
a[i][j]=k;
k++;
}
x=n-1;
for(j=0;j
{
for(i=0;i
if(i%4!=j%4&&(i+j)%4!=3)
{
t=a[i][j];
a[i][j]=a[i][x];
a[i][x]=t;
}
}
x=n-1;
for(i=0;i
{
for(j=0;j
if(i%4!=j%4&&(i+j)%4!=3)
{
t=a[i][j];
a[i][j]=a[x][j];
a[x][j]=t;
}
}
for(i=0;i
{
for(j=0;j
printf("%-4d",a[i][j]);
printf("\n");
}
}
else printf("輸入錯誤\n");
system("pause...");
}