任意階魔方陣(幻方)的演算法及C語言實現

來源:互聯網
上載者:User

標籤:

寫於2012.10:

 

本來這是譚浩強那本《C程式設計(第四版)》的一道課後習題,剛開始做得時候去網上找最優的演算法,結果發現奇數和雙偶數(4的倍數)的情況下演算法都比較簡單,但是單偶數(2的倍數但不是4的倍數)情況一直找不到明確的演算法,就連百度百科對這一問題的解釋也是“因非四的倍數作法相當複雜,在此只介紹四的倍數的作法”,而且連譚浩強那本書給的答案中竟然也變相的限定了n只能為奇數(題目並未說明)。在廣泛尋找資料後,發現了一篇由中南大學資訊科學與工程學院某教授和研究生撰寫的論文,介紹了任意階幻方的演算法,由於網上的資料殘缺不全,也有不少列印錯誤,一直沒弄懂那片論文所介紹的方法(論文地址附後,感興趣的同學可以看看)。當時也就沒編單偶數的情況直接交了作業。

今天又來重新做這道未完成的題,在網書館查閱了資料,後來不經意間發現用“幻方”作為關鍵字搜出了不少演算法(深刻說明某問題…….),詳細閱讀之後,發現單偶數情況的演算法並不是很複雜,網上牛人還是很多的嘛,於是自己嘗試著完成了這道題。

 

回到主題,任意階魔方陣(幻方)的演算法(這裡每種情況只介紹比較常用的一種,其他演算法文後附地址,感興趣的同學可以看看):

1、 奇數情況:羅伯特法,也稱樓梯法。

填寫方法是這樣:
把1(或最小的數)放在第一行正中; 按以下規律排列剩下的n*n-1個數: 
(1)、每一個數放在前一個數的右上一格;
(2)、如果這個數所要放的格已經超出了頂行那麼就把它放在底行,仍然要放在右一列; 
(3)、如果這個數所要放的格已經超出了最右列那麼就把它放在最左列,仍然要放在上一行;
(4)、如果這個數所要放的格已經超出了頂行且超出了最右列,那麼就把它放在前一個數的下一行同一列的格內; 
(5)、如果這個數所要放的格已經有數填入,處理方法同(4)。
這種寫法總是先向“右上”的方向,像是在爬樓梯。

2、 雙偶數情況:對角線互補法:
先說明一個定義:
互補:如果兩個數位和,等於幻方最大數和最小數的和,即 n*n+1,稱為互補。

先看看4階幻方的填法:將數字從左至右、從上到下按順序填寫:
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16

將對角線上(包括主對角線和次對角線)的數字,換成與它互補的數字。
這裡,n*n+1 = 4*4+1 = 17;
把1換成17-1 = 16;把6換成17-6 = 11;把11換成17-11 = 6……換完後就是一個四階幻方。
16 2 3 13
5 11 10 8
9 7 6 12
4 14 15 1
所以,對於n=4k階幻方,我們先把數字按順序填寫。寫好後,按4*4把它劃分成k*k個方陣。因為n是4的倍數,一定能用4*4的小方陣分割。然後把每個小方陣的對角線,象製作4階幻方的方法一樣,對角線上的數字換成互補的數字,就構成幻方。 下面是8階幻方的作法:
(1) 先把數字按順序填。然後,按4*4把它分割成2*2個小方陣
1 2 3 4 5 6 7 8
9 10 11 12 13 14 15 16
17 18 19 20 21 22 23 24
25 26 27 28 29 30 31 32
33 34 35 36 37 38 39 40
41 42 43 44 45 46 47 48
49 50 51 52 53 54 55 56
57 58 59 60 61 62 63 64
(2) 每個小方陣對角線上的數字,換成和它互補的數。
64 2 3 61 60 6 7 57
9 55 54 12 13 51 50 16
17 47 46 20 21 43 42 24
40 26 27 37 36 30 31 33
32 34 35 29 28 38 39 25
41 23 22 44 45 19 18 48
49 15 14 52 53 11 10 56
8 58 59 5 4 62 63 1

3、 單偶數情況:象限對稱交換法(此部分引自志強之家_百度空間,稍作修改)

以n=10為例,10=4×2+2,這時k=2(k=(n-2)/4)
(1) 把方陣分為A,B,C,D四個象限,這樣每一個象限肯定是奇數階。用樓梯法,依次在A象限,D象限,B象限,C象限按奇數階幻方的填法填數。

 

 

(2)在A象限的中間行、中間格開始,按自左向右的方向,標出k格。A象限的其它行則標出最左邊的k格。將這些格,和C象限相對位置上的數,互換位置。

 

 

(3)在B象限任一行的中間格,自右向左,標出k-1列。(註:6階幻方由於k-1=0,所以不用再作B、D象限的資料交換), 將B象限標出的這些數,和D象限相對位置上的數進行交換,就形成幻方。

 

 

 

下面是6階幻方的填法:6=4×1+2,這時k=1

 

這個方法看起來很麻煩,其實掌握了方法就很簡單了。

下面是我編的C語言版的任意階幻方問題,簡單的幾個資料通過了,由於做該習題還未學習函數的內容,所以程式有很多重複冗雜的內容,如有錯誤,敬請大牛指正:

github地址:MagicSquare

 

大一時候寫的。。翻出來整理一下。。

任意階魔方陣(幻方)的演算法及C語言實現

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.