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