| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 6290 人关注过本帖
标题:魔方阵的c语言算法
取消只看楼主 加入收藏
303770957
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:6
帖 子:838
专家分:2125
注 册:2005-9-10
收藏
 问题点数:0 回复次数:4 
魔方阵的c语言算法

魔方阵的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++)
{
for(j=0;j<N;j++)
printf("%3d ",a[i][j]);
if(N<20) printf("\n");
}
}
/*检查矩阵是不是魔方阵并打印幻方和以及元素总和*/
void CheckMagic(int N)
{
unsigned long sum=0L;
int sumH,sumL;
int sumKR=0,sumKL=0;
int i,j;
for(i=0;i<N;i++)
{
sumH=0;sumL=0;
for(j=0;j<N;j++)
{
sumH+=a[i][j];
sumL+=a[j][i];
/*
printf("sumH(%d)=%d,",i,sumH);
printf("sumL(%d)=%d,\n",i,sumL);
*/
sum+=a[j][i];
}
/*
printf("sumH(%d)=%d,",i,sumH);
printf("sumL(%d)=%d\n",i,sumL);
*/
sumKR+=a[i][i];
sumKL+=a[i][N-i-1];
}
/*
printf("sumKR=%d,",sumKR);
printf("sumKL=%d\n",sumKL);
*/
printf("sum/%d=%ld,",N,sum/N);
printf("Total=%ld\n",sum);
printf("It's a magic matrix.\n\n");
}


void store(int N)
{
int i,j;
for(i=0;i<N;i++)
{ for(j=0;j<N;j++)
if(a[i][j]<=9)
fprintf(fp,"000%d ",a[i][j]);
else if(a[i][j]<=99)
fprintf(fp,"00%d ",a[i][j]);
else if(a[i][j]<=999)
fprintf(fp,"0%d ",a[i][j]);
else if(a[i][j]<=9999)
fprintf(fp,"%d ",a[i][j]);
fprintf(fp,"\n\n");
}

}
/*
//将文件Magic.txt的内容读出来显示在屏幕上
void fangzheng()
{
char ch;
if((fp=fopen("Magic.txt","rt"))==NULL)
printf("Cannot open file Magic.txt!\n");
ch=fgetc(fp);
while (ch!=EOF)
{
putchar(ch);
ch=fgetc(fp);
}
fclose(fp);
}
*/
void main()
{
int N;
int i,j;
if((fp=fopen("Magic.txt","w"))==NULL)
printf("File can't be opend.\n");
while(1)
{
lop:
printf("Please input N=",&N);
scanf("%d",&N);
if(N<3)
{
printf("The number you input is invalid !\n");
goto lop;
}
/*循环结束条件N大于99退出*/
if(N>=Q) goto lop1;
/*将魔方阵一字符'\0'填充以备用来判断
方阵中的某个元素是否已经填充数字*/
for(j=0;j<N;j++)
for(i=0;i<N;i++)
a[j][i]='\0';
/*根据N的不同调用不同的魔方填充方法*/
if(N>=3&&(N+1)%2==0) Magic2Kplus1(1,0,0,N);
if(N>=4&& N%4==0) Magic4K(N);
if(N>=6&&(N-2)%4==0) Magic4Kplus2(N);
fprintf(fp,"阶数为%d的魔方阵形排列如下所示:\n\n",N);
/*检查矩阵是不是魔方阵并打印幻方和以及元素总和*/
store(N);
FprintMagic(N);
CheckMagic(N);
}
lop1: fclose(fp);
printf("please press any key to exit ....\n");
getch();
}
/* 运行结果如下:
Please input N=1
The number you input is invalid !
Please input N=2
The number you input is invalid !
Please input N=3
8 1 6
3 5 7
4 9 2
sum/3=15,Total=45
It's a magic matrix.

Please input N=4
1 14 15 4
8 11 10 5
12 7 6 9
13 2 3 16
sum/4=34,Total=136
It's a magic matrix .

Please input N=5
17 24 1 8 15
23 5 7 14 16
4 6 13 20 22
10 12 19 21 3
11 18 25 2 9
sum/5=65,Total=325
It's a magic matrix .

Please input N=6
35 1 6 26 19 24
3 32 7 21 23 25
31 9 2 22 27 20
8 28 33 17 10 15
30 5 34 12 14 16
4 36 29 13 18 11
sum/6=111,Total=666
It's a magic matrix .

Please input N=100
please press any key to exit ....
*/

搜索更多相关主题的帖子: c语言 魔方 算法 
2007-05-04 21:53
303770957
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:6
帖 子:838
专家分:2125
注 册:2005-9-10
收藏
得分:0 

写得不好请大家多多指教.上面是一个n阶魔方阵填充的算法.
关于什么是魔方阵有不懂的可以去http://residence.educities.edu.tw/oddest/index.htm看看.


♂ 死后定当长眠,生前何须久睡。♀
2007-05-04 21:58
303770957
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:6
帖 子:838
专家分:2125
注 册:2005-9-10
收藏
得分:0 
这是
gA09jWXM.rar (27.05 KB) 魔方阵的c语言算法

这个程序的
相关文件,请大家参阅,多多指教.

♂ 死后定当长眠,生前何须久睡。♀
2007-05-04 21:59
303770957
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:6
帖 子:838
专家分:2125
注 册:2005-9-10
收藏
得分:0 

我也无意中发现的,呵呵,看来你是挺喜欢数学的!


♂ 死后定当长眠,生前何须久睡。♀
2007-05-08 00:16
303770957
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:6
帖 子:838
专家分:2125
注 册:2005-9-10
收藏
得分:0 

我是说我是无意中发现http://residence.educities.edu.tw/oddest/index.htm这个网站的,感觉自己对魔方阵挺感兴趣的就自己编写了这个程序,经过了我的努力终于成功了,呵呵,请大家多多指点啊!


♂ 死后定当长眠,生前何须久睡。♀
2007-05-11 11:26
快速回复:魔方阵的c语言算法
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.033042 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved