正文

魔方阵的c语言算法2007-09-26 16:41:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/yanyoushuai/29679.html

分享到:

魔方阵的c语言算法:#include "stdio.h"#define Q 100int a[Q][Q];FILE *fp;void swap(int *a,int *b)/*交换函数*/{  int t;  t=*a;  *a=*b;  *b=t;} void Magic2Kplus1(int t,int H,int L,int N){/*   阶数N是奇数魔方阵   其中int t,表示:从t开始向魔方阵中填数   int H,int L分别表示从从魔方阵中的哪个位置开始填数   int N 表示魔方阵的阶数下面举例子说明以3阶魔方阵为例第1步: 中间填 1x  1  xx  x  xx  x  x第2步:数2应向1的右上角填但是没地方了就移到右下角x  1  xx  x  xx  x  2第3步:数3应向2的右上角填但是没地方了就移到2上一行的最左边x  1  x3  x  xx  x  2第4步:数4应向3的右上角填但是这个地方已经有数字1了就移到3下边x  1  x3  x  x4  x  2第5步:数5向4的右上角填x  1  x3  5  x4  x  2第6步  数6向5的右上角填x  1  63  5  x4  x  2第7步:数7应向6的右上角填但是没地方了就移到6下边x  1  63  5  74  x  2第8步:数8应向7的右上角填但是没地方了就移到3上边8  1  63  5  74  x  2第9步:数9应向8的右上角填但是没地方了就移到5下边8  1  63  5  74  9  2    详情请参看:http://residence.educities.edu.tw/oddest/index.htm*/    int i=H,k=t;   int j=(N-1)/2+L;   a[i][j]=k;   while(1)   {    if(i-1<H&&j+1>=N+L)    {     i++;     a[i][j]=++k;     continue;    }    if(i-1<H) i=N+H-1;     else i--;    if(j+1>=N+L)j=L;      else j++;    if(a[i][j]=='\0') a[i][j]=++k;    else    {    i+=2;    j--;    a[i][j]=++k;    }    if(k==N*N+t-1) break;   }} void Magic4K(int N)/*阶数N是4K的魔方阵*/{/*   雙向翻轉法(4k階) 本法先將數字順序填入方陣之後,再施以兩階段的翻轉,一次縱向、一次橫向,故名雙向翻轉法。 本法僅能填製 4k 階的魔方陣,其填製方法共分三步驟:第一步:將數字由左而右、由上而下順序填入方陣。 第二步:將中央部分半數的列,所有數字左右翻轉。 第三步:將中央部分半數的行,所有數字上下翻轉。如果仔細揣摩數字的分布,其實要將數字由 1 到 n2 一口氣連續填入方陣,並不是難事! 第 1 步:先將數字由左而右、由上而下順序置放方陣中。1  2  3  45  6  7  89 10 11 1213 14 15 16 第 2 步:將第 2、3 列的數字左右翻轉。1  2  3  48  7  6  512 11 10  913 14 15 16 第 3 步:將第 2、3 行的數字垂直翻轉。1 14 15 4 8 11 10 5 12 7 6 9 13 2 3 16 详情请参看:http://residence.educities.edu.tw/oddest/index.htm*/   int i,j,k=1;/*  int t;*/  for(i=0;i<N;i++)  {    if(i<=N/4-1||i>N/4-1+N/2)     for(j=0;j<N;j++)     {       a[i][j]=k;       k++;     }    if(i<=N/4-1+N/2 &&i>N/4-1)      for(j=N-1;j>=0;j--)     {       a[i][j]=k;       k++;     }  }  /*将标记位进行整体翻转换位*/   for(j=N/4;j<(N/4+N/2);j++)     for(i=0;i<N/2;i++)      swap(&a[i][j],&a[N-i-1][j]);/*     {       t=a[i][j];       a[i][j]=a[N-i-1][j];       a[N-i-1][j]=t;      }*/} void Magic4Kplus2(int N) /*阶数N是4K+2的魔方阵*/{/*田字鏡射法(4k+2階)本法僅能填製4k+2(即6、10、14、18...等)的魔方陣。本法填製魔方陣時,先將整個方陣劃成田字型的四個2k+1階的奇數階小方陣,並以下法做註記:1. 右半兩個小方陣中大於 k+2 的列。2. 左半兩個小方陣中(k+1,k+1)的格位。3. 左半兩個小方陣中除了(1,k+1)的格位之外小於k +1的列。以簡捷連續填製法依左上、右下、右上、左下的順序分別填製這四個小方陣。將上半及下半方陣中有註記的數字對調,魔方陣完成。第 1 步:將整個方陣劃成田字型的四個2k+1 階的奇數階小方陣并按阶数是奇数魔方填充方法进行填充 8  1  6  16 19 243  5  7  21 23 254  9  2  22 27 20 35 28 33  17 10 1530 32 34  12 14 1631 36 29  13 18 11 第 2 步 :将第一列上下平移换位35  1  6  16 19 2430  5  7  21 23 2531  9  2  22 27 20 8 28 33  17 10 153 32 34  12 14 164 36 29  13 18 11 第 3 步:将第二列中的5和32换位8  1  6  16 19 243 32  7  21 23 254  9  2  22 27 20 35 28 33  17 10 1530 5  34  12 14 1631 36 29  13 18 11 详情请参看:http://residence.educities.edu.tw/oddest/index.htm*/    int t=N*N/4;    int m=N/2;    int k=(N-2)/4;    int i,j;    Magic2Kplus1(1,0,0,m);    Magic2Kplus1(t+1,m,m,m);    Magic2Kplus1(2*t+1,0,m,m);    Magic2Kplus1(3*t+1,m,0,m);    /*将标记位进行整体平移换位*/    for(j=0;j<k;j++)     for(i=0;i<m;i++)      swap(&a[i][j],&a[i+m][j]);/*     {       t=a[i][j];       a[i][j]=a[i+m][j];       a[i+m][j]=t;      }*/ /*将右半兩個小方陣中的m+k+2列到N-1列进行上下平移换位*/     for(j=m+k+2;j<N;j++)      for(i=0;i<m;i++)       swap(&a[i][j],&a[i+m][j]);/*      {       t=a[i][j];       a[i][j]=a[i+m][j];       a[i+m][j]=t;      }*/      /*将元素a[k][0]和a[k+m][0]换回*/     swap(&a[k][0],&a[k+m][0]);/*     t=a[k][0];     a[k][0]=a[k+m][0];     a[k+m][0]=t;*/     /*将元素a[k][0]和a[k+m][0]换位*/     swap(&a[k][k],&a[k+m][k]);/*     t=a[k][k];     a[k][k]=a[k+m][k];     a[k+m][k]=t;*/}void  FprintMagic(int N){int i,j;if(N>20){printf("Magic matrix already has stored a file which named Magic.txt, plese check it.\n",N);return;}for(i=0;i<N;i++)

阅读(7131) | 评论(0)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

暂无评论
您需要登录后才能评论,请 登录 或者 注册