标题:请教魔方阵的解题思路
只看楼主
xg828
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2006-3-20
 问题点数:0 回复次数:14 
请教魔方阵的解题思路

谭浩强的c语言第七章数组中有一道题:
要求输出1到n的平方的自然数构成的魔方阵,所谓魔方阵是指这样的方阵,它的每一行,每一列和对角线之和均相等,例如:三阶方阵:
8 1 6
3 5 7
4 9 2

思考很久,但是始终不能解决每个元素的对应位置,各个位置的数是如何确定的?请指教,感谢!!

搜索更多相关主题的帖子: 魔方 谭浩强 思路 解题 方阵 
2006-06-19 19:09
SunShining
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:31
帖 子:2215
专家分:0
注 册:2006-2-17
得分:0 
好好的利用 baidu 和 google

[glow=255,violet,2]闭关修炼ing...[/glow] [FLASH=360,180]http://www./chinaren.swf[/FLASH]
2006-06-19 22:52
穆扬
Rank: 1
等 级:禁止发言
帖 子:1910
专家分:0
注 册:2006-6-1
得分:0 
提示: 作者被禁止或删除 内容自动屏蔽

2006-06-19 22:58
–★–
Rank: 3Rank: 3
等 级:新手上路
威 望:6
帖 子:1512
专家分:0
注 册:2006-5-1
得分:0 
//用循环硬算3×3魔方阵
#include<stdio.h>
int B[]={0,1,1,1,1,1,1,1,1,1};//1:空闲,0:已用
#define a m[0][0]
#define b m[0][1]
#define c m[0][2]
#define d m[1][0]
#define e m[1][1]
#define f m[1][2]
#define g m[2][0]
#define h m[2][1]
#define i m[2][2]
main()
{
int m[3][3],j,k;
int OK(int[][3]);
for(a=1;a<=9;a++){B[a]=0;
for(b=1;b<=9;b++)if(B[b]){B[b]=0;
for(c=1;c<=9;c++)if(B[c]){B[c]=0;
if(a+b+c==15)/*提速指令1*/
for(d=1;d<=9;d++)if(B[d]){B[d]=0;
for(e=1;e<=9;e++)if(B[e]){B[e]=0;
for(f=1;f<=9;f++)if(B[f]){B[f]=0;
if(d+e+f==15)/*提速指令2*/
for(g=1;g<=9;g++)if(B[g]){B[g]=0;
for(h=1;h<=9;h++)if(B[h]){B[h]=0;
for(i=1;i<=9;i++)if(B[i])
if(g+h+i==15)/*提速指令3*/
if(OK(m)){printf("\nsolution:\n");
for(j=0;j<3;j++,printf("\n"))
for(k=0;k<3;k++)printf("%3d",m[j][k]);}
B[h]=1;}
B[g]=1;}
B[f]=1;}
B[e]=1;}
B[d]=1;}
B[c]=1;}
B[b]=1;}
B[a]=1;}
}

int OK(int n[][3])
{
int j,k,s;
for(j=0;j<3;j++){
for(s=k=0;k<3;k++)
s+=n[k][j];
if(s-15)return 0;}
if(n[0][0]+n[1][1]+n[2][2]-15)return 0;
return !(n[2][0]+n[1][1]+n[0][2]-15);
}

落霞与孤鹜齐飞,秋水共长天一色! 心有多大,路有多宽。三教九流,鸡鸣狗盗。兼收并蓄,海纳百川。
2006-06-19 22:59
SunShining
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:31
帖 子:2215
专家分:0
注 册:2006-2-17
得分:0 


[glow=255,violet,2]闭关修炼ing...[/glow] [FLASH=360,180]http://www./chinaren.swf[/FLASH]
2006-06-19 23:14
SunShining
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:31
帖 子:2215
专家分:0
注 册:2006-2-17
得分:0 
网上很多算法.这也是俺以前照网上的算法写的...(不过也忘的差不多了.你自己去找)

[CODE]# include<stdio.h>
main()
{
int m[16][16];
int i,j,k,n,p;
p=1;
while(p==1)
{
printf("please input the n \n");/* 15以内 */
scanf("%d",&n);
if((n!=0)&&(n<=15)&&(n%2!=0))
p=0;
}
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
m[i][j]=0;
j=n/2+1;
m[1][j]=1;
for(k=2;k<=n*n;k++)
{
i=i-1;
j=j+1;
if((i<1)&&(j>n))
{
i=i+2;
j=j-1;
}
else
{
if(i<1)
i=n;
if(j>n)
j=1;
}
if(m[i][j]==0)
m[i][j]=k;
else
{
i=i+2;
j=j-1;
m[i][j]=k;
}
}
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
printf("%4d",m[i][j]);
printf("\n");
}
getch();
}[/CODE]

[glow=255,violet,2]闭关修炼ing...[/glow] [FLASH=360,180]http://www./chinaren.swf[/FLASH]
2006-06-19 23:28
穆扬
Rank: 1
等 级:禁止发言
帖 子:1910
专家分:0
注 册:2006-6-1
得分:0 
提示: 作者被禁止或删除 内容自动屏蔽

2006-06-19 23:31
feng1256
Rank: 4
等 级:贵宾
威 望:14
帖 子:2899
专家分:0
注 册:2005-11-24
得分:0 
以下是引用xg828在2006-6-19 19:09:57的发言:

谭浩强的c语言第七章数组中有一道题:
要求输出1到n的平方的自然数构成的魔方阵,所谓魔方阵是指这样的方阵,它的每一行,每一列和对角线之和均相等,例如:三阶方阵:
8 1 6
3 5 7
4 9 2

思考很久,但是始终不能解决每个元素的对应位置,各个位置的数是如何确定的?请指教,感谢!!

一般最简单的算法是偶数和奇数分开算,自己搜索吧,估计多得你都看不过来


叁蓙大山:工謪、稅務、嗣發 抱歉:不回答女人的问题
2006-06-19 23:45
cordier
Rank: 2
等 级:论坛游民
威 望:1
帖 子:449
专家分:14
注 册:2006-2-9
得分:0 
好像是(印象中)
随便在哪一个位置写一个1
然后再它的右上方写2,同样地接下去3、4、5。
如果它的右上方已经有了数字,那么就在它的下方填写该数字

2006-06-20 09:09
–★–
Rank: 3Rank: 3
等 级:新手上路
威 望:6
帖 子:1512
专家分:0
注 册:2006-5-1
得分:0 
//用循环"硬算"4×4魔方阵
#include<stdio.h>
int B[]={0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1};//1:空闲,0:已用
#define a m[0][0]
#define b m[0][1]
#define c m[0][2]
#define d m[0][3]
#define e m[1][0]
#define f m[1][1]
#define g m[1][2]
#define h m[1][3]
#define i m[2][0]
#define t m[2][1]
#define u m[2][2]
#define v m[2][3]
#define w m[3][0]
#define x m[3][1]
#define y m[3][2]
#define z m[3][3]

main()
{
int m[4][4],j,k;
int OK(int[][4]);
for(a=1;a<=16;a++){B[a]=0;
for(b=1;b<=16;b++)if(B[b]){B[b]=0;
for(c=1;c<=16;c++)if(B[c]){B[c]=0;
for(d=1;d<=16;d++)if(B[d]){B[d]=0;if(a+b+c+d==34)
for(e=1;e<=16;e++)if(B[e]){B[e]=0;
for(f=1;f<=16;f++)if(B[f]){B[f]=0;
for(g=1;g<=16;g++)if(B[g]){B[g]=0;
for(h=1;h<=16;h++)if(B[h]){B[h]=0;if(e+f+g+h==34)
for(i=1;i<=16;i++)if(B[i]){B[i]=0;
for(t=1;t<=16;t++)if(B[t]){B[t]=0;
for(u=1;u<=16;u++)if(B[u]){B[u]=0;
for(v=1;v<=16;v++)if(B[v]){B[v]=0;if(i+t+u+v==34)
for(w=1;w<=16;w++)if(B[w]){B[w]=0;
for(x=1;x<=16;x++)if(B[x]){B[x]=0;
for(y=1;y<=16;y++)if(B[y]){B[y]=0;
for(z=1;z<=16;z++)if(B[z])if(w+x+y+z==34)
if(OK(m)){printf("\nsolution:\n");
for(j=0;j<4;j++,printf("\n"))
for(k=0;k<4;k++)printf("%3d",m[j][k]);}
B[y]=1;}
B[x]=1;}
B[w]=1;}
B[v]=1;}
B[u]=1;}
B[t]=1;}
B[i]=1;}
B[h]=1;}
B[g]=1;}
B[f]=1;}
B[e]=1;}
B[d]=1;}
B[c]=1;}
B[b]=1;}
B[a]=1;}
}

int OK(int n[][4])
{
int j,k,s;
for(j=0;j<4;j++){
for(s=k=0;k<4;k++)
s+=n[k][j];
if(s-34)return 0;}
if(n[0][0]+n[1][1]+n[2][2]+n[3][3]-34)return 0;
return !(n[3][0]+n[2][1]+n[1][2]+n[0][3]-34);
}

落霞与孤鹜齐飞,秋水共长天一色! 心有多大,路有多宽。三教九流,鸡鸣狗盗。兼收并蓄,海纳百川。
2006-06-20 09:16



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-73433-1-1.html




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

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