n階幻方的構造

來源:互聯網
上載者:User

 根據構造方法的不同,幻方可以分成三類:奇數階幻方、4M階幻方和4M + 2階幻方,其中M為自然數,2階幻方不存在。

 1 奇數階幻方構造法

 (1) 將1放在第一行中間一列;

 (2) 從2開始直到n×n止各數依次按下列規則存放:按 45°方向行走,向右上,即每一個數存放的行比前一個數的行數減1,列數加1

 (3) 如果行列範圍超出矩陣範圍,則迴繞。例如1在第1行,則2應放在最下一行,列數同樣加1;

 (4) 如果按上面規則確定的位置上已有數,或上一個數是第1行第n列時,則把下一個數放在上一個數的下面。

 

/begin{bmatrix}
8 & 1 & 6 //
3 & 5 & 7 //
4 & 9 & 2 //
/end{bmatrix}">

2 偶數階幻方構造

2.1 4m階的幻方

(1) 把數1到n×n按從上至下,從左至右順序填入矩陣

(2) 將方陣的所有4×4子方陣中的兩對角線上位置的數關於方陣中心作對稱交換,即a(i,j)與a(n-1-i,n-1-j)交換,所有其它位置上的數不變。

/begin{bmatrix}
1 & 2 & 3 & 4 //
5 & 6 & 7 & 8 //
9 & 10 & 11 & 12 //
13 & 14 & 15 & 16
/end{bmatrix}"> ------------->/begin{bmatrix}
1 & 15 & 14 & 4 //
12 & 6 & 7 & 9 //
8 & 10 & 11 & 5 //
13 & 3 & 2 & 16
/end{bmatrix}">

3 4m+2階幻方

(1) 首先構造n-2=4m的幻方,然後放在n階幻方的中心

(2) 將4m階幻方中每個數都加上8m+2;

(3) 將1,2,...,8m+2 與 ....(4m+2)2成對排在外圍的一圈,如,注意中心的4m階未加上8m+2,且保證每對數相加=1+(4m+2)2

/begin{bmatrix}
1 & 9 & 34 & 33 & 32 & 2 //
6 & 11 & 25 & 24 & 14 & 31 //
10 & 22 & 16 & 17 & 19 & 27 //
30 & 18 & 20 & 21 & 15 & 7 //
29 & 23 & 13 & 12 & 26 & 8 //
35 & 28 & 3 & 4 & 5 & 36
/end{bmatrix}">

4 程式碼範例

4.1 奇階幻方的產生

/**<br />* @author: contribute to wikipedia according GNU<br />* @description: 用於創建奇數階的幻方<br />*/<br />public class magic_squre_odd {<br /> static int matrix[][];<br /> static int n;<br /> public static void magic_squre_odd_generate()<br /> { matrix = new int[n][n];<br /> //將所有的數初始化為0<br /> for(int i = 0; i < n; i++)<br /> for(int j = 0; j < n; j++)<br /> matrix[i][j] = 0;<br /> matrix[0][(n+1)/2 -1] = 1;<br /> int x = 0,y = ((n+1)/2 -1);<br /> //count: 記住已經插入過的數<br /> for(int count = 2; count<=n*n;count++)<br /> while(true)<br /> {<br /> //先x-1 y+1<br /> x-=1;<br /> y+=1;</p><p> //判斷是否可以插入<br /> while(true)<br /> {//循環判斷是否越界,直到一個地方不越界為止<br /> //判斷是否越界:<br /> //越上界x<0,則移到最下方x=x+n,y不變; continue<br /> if(x<0)<br /> {<br /> x = x + n;<br /> continue;<br /> }<br /> //越右界y>=n,則y=y-n,x不變;continue<br /> if(y>=n)<br /> {<br /> y = y - n;<br /> continue;<br /> }</p><p> //循環判斷是否該位置已經有數據,直到找到一個空位<br /> //如果有數據,則移到x = x + 2;y = y - 1; continue<br /> if (y<0){y=y+n;continue;}<br /> if(matrix[x][y] != 0 )<br /> {<br /> x = x + 2;y = y - 1;<br /> if (x>=n){x=x-n;continue;}<br /> if (y<0){y=y+n;continue;}<br /> continue;<br /> }<br /> break;<br /> }<br /> //將當前的count值賦給選出的空位<br /> matrix[x][y]= count;<br /> break;<br /> }<br /> }<br /> public static void print()<br /> {<br /> for(int i = 0; i < n; i++)<br /> {<br /> for(int j = 0; j < n; j++)<br /> {<br /> //System.out.println(matrix[i][j]);<br /> System.out.print(matrix[i][j]);<br /> System.out.print("_");<br /> }<br /> System.out.print("/n");<br /> }<br /> }</p><p> public static void main(String[] args)<br /> { //手工輸入n的值,並確保為奇數<br /> n = 11;<br /> magic_squre_odd_generate();<br /> print();<br /> }<br />}<br />

4.2 4m階幻方的產生

/**<br />* @author: contribute to wikipedia according GNU<br />* @description: 用於建立4階的幻方<br />*<br />*/<br />public class magic_square_4m {<br />/**<br /> * @param args<br /> */<br />static int matrix[][];<br />static int n;<br />static void magic_squre_4m_generate()<br />{<br /> //初始化matrix<br />matrix = new int[n][n];<br /> //將matrix裡的位置用數順序排列<br /> int ini = 0;<br /> for(int i = 0; i < n; i++)<br /> for(int j = 0; j < n; j++)<br /> matrix[i][j] = ++ini;</p><p> //列印對調前的樣子<br /> System.out.println("對調之前的樣子:");<br /> print();</p><p> //然後對調(僅對右上方的數進行遍曆)<br /> for(int i = 0; i < n; i++)<br /> for(int j = i + 1; j < n; j++)<br /> {<br /> if(( i != j) && (i + j) != (n -1) )<br /> { //對不在主付對角線上的數關於中心對調<br /> int temp;<br /> temp = matrix[i][j];<br /> matrix[i][j] = matrix[n -1 - i][n - 1 - j];<br /> matrix[n -1 - i][n - 1 - j] = temp;<br /> }<br /> }<br />}</p><p>public static void print()<br />{<br />for(int i = 0; i < n; i++)<br />{<br />for(int j = 0; j < n; j++)<br /> {<br />System.out.print(matrix[i][j]);<br />System.out.print("_");<br /> }<br />System.out.print("/n");<br />}<br />}</p><p>public static void main(String[] args) {<br /> //這裏手動設定n的數值為4,這裡只能設定為4,因為只求4階幻方<br />n = 4;<br />magic_squre_4m_generate();<br />System.out.println("對調之後的樣子:");<br />print();<br />}<br />}<br />

 

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.