Highslide for Wordpress Plugin

維基百科對魔方陣的介紹

始傳中國最古老的魔方陣是大禹治水時在龜背上發現的洛書,龜甲上有9種花點的圖案,分別代表1~9這9個數,而3行、3列以及兩對角線上各自的數之和均為15。

File:Jiushutu.png

一個魔方陣可以使用N階方陣來表示,方陣的每行、每列以及兩條對角線的和都等於常數M2(N),如果填充數為1,2,\dots,N^2,那麼有

M_2(N) = \frac{N(N^2+1)}{2}

魔方陣的產生以奇數階最為簡單,做法為一開始先將1填入第一列的中間位置,然後按照下列規則:
(1)數值加1,填入左上方的空格;
(2)假設該方格已填滿,則在原地的下方填入數字;
(3)若超出方陣,則往下到最底層或往右到最右方,視兩者那一個有空格則填上數字;
(4)若兩者皆無空格,則在原地的下一方格填上數字。

   1: #include <stdio.h>

   2: #include <stdlib.h>

   3: #include <conio.h>

   4: #define size 9

   5: void print_out(int n[size][size]);

   6: int main()

   7: {

   8:     int a[size][size]={0},key=1,i,j;

   9:     char b;

  10:     printf("以下是一個計算奇數%d階魔方陣的程式,做法為\n",size);

  11:     printf("先將1填入第一列的中間位置,然後按照下列規則:\n");

  12:     printf("(1)數值加1,填入左上方的空格;\n");

  13:     printf("(2)假設該方格已填滿,則在原地的下方填入數字;\n");

  14:     printf("(3)若超出方陣,則往下到最底層或往右到最右方,視兩者那一個有空格則填上數字;\n");

  15:     printf("(4)若兩者皆無空格,則在原地的下一方格填上數字。\n");

  16:     printf("\n開始執行前請選擇是否要顯示過程(Y/N)?[N]\n");

  17:     b=getch(); 

  18:     /*將1放到最上列的中間位置*/

  19:     a[0][(size-1)/2]=key;

  20:     /*i,j為當前座標點*/

  21:     i=0;

  22:     j=(size-1)/2;

  23:     while(key<size*size)

  24:     {

  25:         key++;

  26:         /*針對規則3的處理*/

  27:         if(i-1<0)i=size-1;

  28:         else i=i-1;

  29:         if(j-1<0)j=size-1;

  30:         else j=j-1;

  31:         if(a[i][j]==0)a[i][j]=key;

  32:         /*針對規則2,4已有數字的處理*/

  33:         else if(a[i][j]!=0)

  34:         {

  35:             if(i+2>size-1)i=i+2-size;

  36:             else i=i+2;

  37:             if(j+1>size-1)j=0;

  38:             else j=j+1;

  39:             a[i][j]=key;

  40:         }

  41:         /*利用ASCII碼判斷當初是否選擇要顯示過程(y/Y)*/

  42:         if(b==121 || b==89)print_out(a);

  43:     }

  44:     /*若當初按下的鍵不是(y/Y)的話直接顯示最終結果*/

  45:     if(b!=121 && b!=89)print_out(a);

  46:     system("pause");

  47:     return 0;

  48: }

  49: void print_out(int n[size][size])

  50: {

  51:     int i,j;

  52:     printf("┌─");

  53:     for(i=0;i<size-1;i++)

  54:     {

  55:         printf("┬─");

  56:     }

  57:     printf("┐\n");

  58:     for(i=0;i<size;i++)

  59:     {

  60:         printf("│");

  61:         for(j=0;j<size;j++)

  62:         {

  63:             if(n[i][j]!=0)printf("%2d│",n[i][j]);

  64:             else printf(" │");

  65:         }

  66:         printf("\n");

  67:         if(i<size-1)

  68:         {

  69:             printf("├─");

  70:             for(j=0;j<size-1;j++)

  71:             {

  72:                 printf("┼─");

  73:             }

  74:             printf("┤\n");

  75:         }

  76:     }

  77:     printf("└─");

  78:     for(i=0;i<size-1;i++)

  79:     {

  80:         printf("┴─");

  81:     }

  82:     printf("┘\n");

  83: }

更改第四行size的值可以產生不同階的魔方陣,以上程式碼效果是利用Windows Live Writer+Code Snippet所達成。

Related Posts with Thumbnails
留下迴響