魔方陣


魔方陣也叫幻方縱橫圖是指組成元素為自然數1、2、…、n2的平方的n×n方陣,1~n中的每個數都會出現在元素中,且不重復出現,且每行每列以及主、副對角線上各n個元素之和都相等。

根據魔方陣的階數,魔方陣分為,奇數階魔方陣雙偶數階魔方陣單偶數階魔方陣。(奇數階指的是從3開始的奇數,雙偶數指的是能被4整除的偶數,單偶數指的是從2開始的偶數能被2整除而不能被4整除的數;用公式來表示就是2k+1,k=1,3,...;4k,k=1,2...;2k,k=1,3...;)

 

奇數階魔方陣

奇數階魔方陣只有一個

 

規律

1. 第一行的中間位置為1。

2. 數字a所在的位置為a-1的位置上移,右移。

3. 當a-1在第一行時,a在最后一行;當a-1在最后一列時,a在第一列。

4.若a-1的元素值為n的倍數,則a所在的位置為a-1的位置下移。

 

填充思路

1. 令第一行中間的元素為1。

2. 沿着副對角線填充元素。

3. 若行數超出二維數組范圍,初始化行到最后一行。

4. 若列數超出二維數組范圍,初始化列到第一列。

6.若要填充的位置已有值,行數加一,列數不變。

 

c語言實現

實現奇數階魔方陣的算法有很多,這里僅僅是其中一種。算法核心有輪回結構,以及判斷下一個位置是否有數值。本算法用的是當型輪回結構;巧妙地運用了當m為階數的倍數時,下一個位置肯定已經填充過數值的的規律,來判斷下一個位置是否有數值。

 0 //m代表1~n2的自然數 n為階數 i為行數 j為列數
1
for(int m=1;m<=n*n;)                           //從1開始遍歷 2 { 3 if(m>=n&&m%n==0)                        //若m為階數的倍數 4 { 5 if(i>=0&&i<n&&j>=0&&j<n) {a[i][j]=m;i++;m++;}    //若行列均正常 6 else 7 { 8 if(i==-1) i=n-1;                   //若行溢出了
9 if(j==n) j=0;                     //若列溢出了 10 } 11 } 12 if(m<n||m%n!=0)                         //若m不是階數的倍數 13 { 14 if(i>=0&&i<n&&j>=0&&j<n) {a[i][j]=m;i--;j++;m++;}   //若行列均正常 15 else 16 { 17 if(i==-1) i=n-1;                    //若行溢出了 18 if(j==n) j=0;                      //若列溢出了 19 } 20 } 21 22 }

 

雙偶數階魔方

雙偶數階魔方


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM