magic矩阵
魔方矩陣
? ? ?魔方矩陣是有相同的行數(shù)和列數(shù),并在每行每列、對(duì)角線上的和都相等。你能構(gòu)造任何大小(除了2x2)的魔方矩陣。
1.歷史
? ? ? 魔方又稱(chēng)幻方、縱橫圖、九宮圖,最早記錄于我國(guó)古代的洛書(shū)。據(jù)說(shuō)夏禹治水時(shí),河南洛陽(yáng)附近的大河里浮出了一只烏龜,背上有一個(gè)很奇怪的圖形,古人認(rèn)為是一種祥瑞,預(yù)示著洪水將被夏禹王徹底制服。后人稱(chēng)之為"洛書(shū)"或"河圖",又叫河洛圖。 南宋數(shù)學(xué)家楊輝,在他著的《續(xù)古摘奇算法》里介紹了這種方法:只要將九個(gè)自然數(shù)按照從小到大的遞增次序斜排,然后把上、下兩數(shù)對(duì)調(diào),左、右兩數(shù)也對(duì)調(diào);最后再把中部四數(shù)各向外面挺出,幻方就出現(xiàn)了。 (摘自《趣味數(shù)學(xué)辭典》) 在西方,阿爾布雷特·丟勒于1514年創(chuàng)作的木雕《憂郁》是最早關(guān)于魔方矩陣的記載。有學(xué)者認(rèn)為,魔方矩陣和風(fēng)靡一時(shí)的煉金術(shù)有關(guān)。幾個(gè)世紀(jì)以來(lái),魔方矩陣吸引了無(wú)數(shù)的學(xué)者和數(shù)學(xué)愛(ài)好者。本杰明·富蘭克林就做過(guò)有關(guān)魔方矩陣的實(shí)驗(yàn)。 最簡(jiǎn)單的魔方就是平面魔方,還有立體魔方、高次魔方等。對(duì)于立體魔方、高次魔方世界上很多數(shù)學(xué)家仍在研究,本文只討論平面魔方。 每行、每列及對(duì)角線之和被稱(chēng)為魔術(shù)常量或魔法總和,M。 其中,n為矩陣階數(shù)。 例如,如果n=3,則M=[3*(3^2+1)]/2 = 15.2.魔方構(gòu)造
?? ? 平面魔方的一般定義:將自然數(shù) 1 到 N^2, 排列 N 行 N 列的方陣,使每行、每列及兩條主對(duì)角線上的 N 個(gè)數(shù)的和都等于N (N^2+1)/2,這樣的方陣稱(chēng)為 N 階幻方。?
通過(guò)搜索整理后,得到下面的算法:?
對(duì)平面魔方的構(gòu)造,分為三種情況:N為奇數(shù)、N為4的倍數(shù)、N為其它偶數(shù)(4n+2的形式)N 為奇數(shù)時(shí)
(1) 將1放在第一行中間一列; (2) 從2開(kāi)始直到n×n止各數(shù)依次按下列規(guī)則存放: 按 45°方向行走,如向右上 每一個(gè)數(shù)存放的行比前一個(gè)數(shù)的行數(shù)減1,列數(shù)加1 (3) 如果行列范圍超出矩陣范圍,則回繞。 例如1在第1行,則2應(yīng)放在最下一行,列數(shù)同樣減1; (4) 如果按上面規(guī)則確定的位置上已有數(shù),或上一個(gè)數(shù)是第1行第n列時(shí), 則把下一個(gè)數(shù)放在上一個(gè)數(shù)的下面。N為4的倍數(shù)時(shí)
采用對(duì)稱(chēng)元素交換法。 首先把數(shù)1到n×n按從上至下,從左到右順序填入矩陣 然后將方陣的所有4×4子方陣中的兩對(duì)角線上的數(shù)關(guān)于大方陣中心作中心對(duì)稱(chēng)交換(注意是各4×4子方陣對(duì)角線上的數(shù)), 即a(i,j)與a(n-1-i,n-1-j)交換,所有其它位置上的數(shù)不變。(或者將對(duì)角線不變,其它位置對(duì)稱(chēng)交換也可)N 為其它偶數(shù)時(shí)
? ? ? 當(dāng)n為非4倍數(shù)的偶數(shù)(即4n+2形)時(shí):首先把大方陣分解為4個(gè)奇數(shù)(2m+1階)子方陣。 按上述奇數(shù)階魔方給分解的4個(gè)子方陣對(duì)應(yīng)賦值 上左子陣最小(i),下右子陣次小(i+v),下左子陣最大(i+3v),上右子陣次大(i+2v) 即4個(gè)子方陣對(duì)應(yīng)元素相差v,其中v=n*n/4 四個(gè)子矩陣由小到大排列方式為 ① ③ ④ ② 然后作相應(yīng)的元素交換:a(i,j)與a(i+u,j)在同一列做對(duì)應(yīng)交換(jn-t+1), 注意其中j可以取零。 a(t-1,0)與a(t+u-1,0);a(t-1,t-1)與a(t+u-1,t-1)兩對(duì)元素交換 其中u=n/2,t=(n+2)/4 上述交換使每行每列與兩對(duì)角線上元素之和相等。3.算法設(shè)計(jì)
先在矩陣第一行中間的位置上放1,然后把數(shù)字按照升序沿著左上角放置到矩陣中。如果越界了,就假設(shè)周?chē)€有一個(gè)矩陣,將數(shù)字放到那個(gè)位置上;如果那個(gè)位置已經(jīng)被占據(jù)了,就跳過(guò)該位置放到下面的位置,然后重新按照原來(lái)的方法放。如圖:在5×5的魔術(shù)矩陣中,放完1以后,就把2放到1的左上角,但是此時(shí)已經(jīng)越界了。假設(shè),在原來(lái)的矩陣上面還有一個(gè)矩陣,則數(shù)字2所放的位置應(yīng)該是在最后一行的第二個(gè)位置,接下去就要把數(shù)字3放到2的左上角,依次放下去,當(dāng)放到6的時(shí)候,由于1已經(jīng)將下一個(gè)位置占了,所以就放到5下面的位置。依照這樣的規(guī)律直到把數(shù)字都放完。4.魔方函數(shù)
Matlab中自動(dòng)生成魔方矩陣的函數(shù): magic(n) n是矩陣維數(shù),例如在MATLAB命令窗口輸入
magic(5) ,將隨機(jī)產(chǎn)生5階魔方陣。
| 1 2 3 4 5 6 7 8 | >>?magic(4) ans?= ??????16????????????? 2????????????? 3???????????? 13?????? ???????5???????????? 11???????????? 10????????????? 8?????? ???????9????????????? 7????????????? 6???????????? 12?????? ???????4???????????? 14???????????? 15????????????? 1? |
《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專(zhuān)家共同創(chuàng)作,文字、視頻、音頻交互閱讀
總結(jié)