1. 程式人生 > >魔方陣(4k)

魔方陣(4k)

魔方陣 :n=4k(n=4,8,12,16...  k=1,2,3,4..)

一、規律

(1)把1到n^2這些數字按照順序填寫到n*n格子中, 4*4把它分割成k*k個小方陣。

        (因為n是4的倍數,所以一定能用4*4個小方陣分割)

  (2)  將各個對角線上的數字,換成與它互補的數字。

      (互補:最大數字與最小數字的和,即n*n+1)

二、填數過程(以8*8方陣為例)

把1到8^2=64這些數字按照順序填寫到8*8格子中, 4*4把它分割成2*2個小方陣。

② 將各個對角線上的數字,換成與它互補的數字。

    (1-----64

        (10----55)

                (19---46)

                   (28---37)

 

三、程式部分說明

a、在小正方形的4*4中尋找右下方向對角線第一個元素,觀察規律,發現 行%4==0,並且 (行-列)%4==0

     對角線元素取其互補數  行+1   列+1  往右下方向遍歷

b、小正方形的4*4中尋找右上方向對角線第一個元素,觀察規律,發現 行%4==3,並且 (行+列  %4==3

    對角線元素取其互補數  行-1   列+1   往右上方向遍歷

四、程式編寫如下:

[cpp] view plain copy

  1. #include<stdio.h>  
  2. #include<math.h>  
  3. #include<assert.h>  
  4. void Even4kMagicSquare(int n)  
  5. {  
  6.     assert(n % 4 == 0);//保證是4的倍數  
  7.     int a[100][100];  
  8.     int num = 1;  
  9.     for (int i = 0; i < n; i++)//從1到n的平方依次賦值    
  10.     {  
  11.         for (int j = 0; j < n; j++)  
  12.         {  
  13.             a[i][j] = num;  
  14.             num++;  
  15.         }  
  16.     }  
  17.     for (int i = 0; i < n; i++)//小正方形的對角線上的數字取其補數  
  18.     {  
  19.         for (int j = 0; j < n; j++)  
  20.         {  
  21.             if (i % 4 == 0 && abs(i - j) % 4 == 0)//右下對角線(0,0)(0,4)(4,0)(4,4)...   
  22.             {  
  23.                 for (int k = 0; k < 4; k++)//abs為整型絕對值函式  
  24.                 {  
  25.                     a[i + k][j + k] = abs(n*n + 1 - a[i + k][j + k]);  
  26.                 }  
  27.             }  
  28.             if (i % 4 == 3 && (i + j) % 4 == 3)//右上方向對角線(3,0)(3,4)(7,0)(7,4)...  
  29.             {  
  30.                 for (int k = 0; k < 4; k++)  
  31.                 {  
  32.                     a[i - k][j + k] = abs(n*n + 1 - a[i - k][j + k]);  
  33.                 }  
  34.             }  
  35.   
  36.         }  
  37.     }  
  38.     for (int i = 0; i < n; i++)  
  39.     {  
  40.         for (int j = 0; j < n; j++)  
  41.         {  
  42.             printf("%-5d", a[i][j]);  
  43.         }  
  44.         printf("\n\n");  
  45.     }  
  46. }  
  47.   
  48. int main()  
  49. {  
  50.     Even4kMagicSquare(8);  
  51.     return 0;  
  52. }  

執行結果: