魔方阵的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++)

评论