正文

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

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

分享到:

魔方阵的c语言算法:
#include "stdio.h"
#define Q 100
int 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步: 中间填 1
x  1  x
x  x  x
x  x  x
第2步:数2应向1的右上角填但是没地方了就移到右下角
x  1  x
x  x  x
x  x  2
第3步:数3应向2的右上角填但是没地方了就移到2上一行的最左边
x  1  x
3  x  x
x  x  2
第4步:数4应向3的右上角填但是这个地方已经有数字1了就移到3下边
x  1  x
3  x  x
4  x  2
第5步:数5向4的右上角填
x  1  x
3  5  x
4  x  2
第6步  数6向5的右上角填
x  1  6
3  5  x
4  x  2
第7步:数7应向6的右上角填但是没地方了就移到6下边
x  1  6
3  5  7
4  x  2
第8步:数8应向7的右上角填但是没地方了就移到3上边
8  1  6
3  5  7
4  x  2
第9步:数9应向8的右上角填但是没地方了就移到5下边
8  1  6
3  5  7
4  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  4
5  6  7  8
9 10 11 12
13 14 15 16

第 2 步:將第 2、3 列的數字左右翻轉。
1  2  3  4
8  7  6  5
12 11 10  9
13 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 24
3  5  7  21 23 25
4  9  2  22 27 20

35 28 33  17 10 15
30 32 34  12 14 16
31 36 29  13 18 11


第 2 步 :
将第一列上下平移换位
35  1  6  16 19 24
30  5  7  21 23 25
31  9  2  22 27 20

8 28 33  17 10 15
3 32 34  12 14 16
4 36 29  13 18 11

第 3 步:
将第二列中的5和32换位
8  1  6  16 19 24
3 32  7  21 23 25
4  9  2  22 27 20

35 28 33  17 10 15
30 5  34  12 14 16
31 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++)

阅读(7055) | 评论(0)


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

评论

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