标题:请教大家这个题该怎么做啊
只看楼主
仁者无敌
Rank: 1
等 级:新手上路
帖 子:199
专家分:0
注 册:2006-3-5
 问题点数:0 回复次数:9 
请教大家这个题该怎么做啊

这是谭浩强教授课本上的
输出魔方阵.所谓魔方阵是指这样的方阵,它的每一行,每一列,和对角线之和均相等.例如,三阶魔方阵为
8 1 6
3 5 7
4 9 2
要求输出1到N方的自然数构成的魔方阵.

不求大家把答案告诉给我,只是告诉给我思路.
我连排魔方的方法都不会,别说编程了,呵呵!

搜索更多相关主题的帖子: 魔方 谭浩强 自然数 方阵 
2006-03-09 06:18
ヤ順祺冄繎ヤ
Rank: 8Rank: 8
等 级:贵宾
威 望:42
帖 子:3032
专家分:0
注 册:2005-11-9
得分:0 
#include<stdio.h>
#define N 3
main()
{int a[N][N];
int i,j,oi,oj,k;
for(i=0;i<N;i++)
for(j=0;j<N;j++)
a[i][j]=0;
i=0;
j=(N-1)/2;
a[i][j]=1;
for(k=2;k<=N*N;k++)
{oi=i;
oj=j;
i--;
j++;
if(i<0) i=N+i;
if(j>N-1) j=0;
if(a[i][j]==0) a[i][j]=k;
else
{i=oi+1;
j=oj;
a[i][j]=k;}

}
for(i=0;i<N;i++)
{for(j=0;j<N;j++)
printf("%d\t ",a[i][j]);
printf("\n");
}

}

[此贴子已经被作者于2006-3-9 9:05:46编辑过]

2006-03-09 09:05
ヤ順祺冄繎ヤ
Rank: 8Rank: 8
等 级:贵宾
威 望:42
帖 子:3032
专家分:0
注 册:2005-11-9
得分:0 
1.先将1放在第一行的中间位置。
2.从“2”开始直到N*N止,各数依次按下列规则放数:每个数放的行在前一个数的行数减1,列数加1.
3.如果上一个数的行数为1,则下一个数的行数为最后一行。当上一个数的列数为最后一列时,下一个列数为第一列。
4.如果下一个数应放的位置已被占,则下一个数放在上一个数的下面。
2006-03-09 09:06
zhangjuan
Rank: 1
等 级:新手上路
帖 子:992
专家分:0
注 册:2006-1-19
得分:0 

是谭浩强教授课本上的
输出魔方阵.所谓魔方阵是指这样的方阵,它的每一行,每一列,和对角线之和均相等.例如,三阶魔方阵为
8 1 6
3 5 7
4 9 2
要求输出1到N方的自然数构成的魔方阵.

不求大家把答案告诉给我,只是告诉给我思路.
我连排魔方的方法都不会,别说编程了,呵呵!
我想了一个思路,不知道可行不,我想可能太复杂了吧
首先定义一个二维数组如a[100][100],sum1[100],sum2[100]
sum3[100],sum4[100]键盘输入n的值(n<100),用循环控制行列
for(i=0;i<n;i++)
for(j=0;j<n;j++)/*j控制列,i控制行*/
然后利用随机函数random(9),产生9范围之内的值,读入到a[i][j]
中,利用循环嵌套,先取sum1[0]=a[0][0]+…a[0][j],依此类推,
sum1[i]=a[i-1][j-1]+…a[i][j],用通俗的话讲,也就是i循环1
次,j循环n次,用sum1[i]存放每一行的累加值。存放完毕之后,然后
for(i=0;i<n;i++)
if(sum1[0]==sum1[i])如果相等就打印出来,不相等由计算机重新取值
这只是求每一行的,而每一列,还有两条对角线也是同样的方法。
应该是这样吧,我也是才想的。
我是菜鸟,也不怎么懂!


2006-03-09 09:57
wenyong
Rank: 1
等 级:新手上路
帖 子:251
专家分:0
注 册:2005-8-9
得分:0 
正确

2006-03-09 12:39
一一凌
Rank: 1
等 级:新手上路
帖 子:45
专家分:0
注 册:2006-2-16
得分:0 

有魔方阵专门的算法,比较简单.只是写起来挺麻烦.

2006-03-09 14:51
梦想中国
Rank: 2
等 级:新手上路
威 望:5
帖 子:539
专家分:0
注 册:2006-2-26
得分:0 
2楼,正确

2006-03-09 15:28
Xxibug
Rank: 1
等 级:新手上路
威 望:1
帖 子:95
专家分:0
注 册:2006-1-31
得分:0 

(-_-;),新版主直接给代码,考验楼主定力
单数幻方有个算法,搜一下就看到了


=======【天上有人 地上有狼】=======
2006-03-09 16:25
仁者无敌
Rank: 1
等 级:新手上路
帖 子:199
专家分:0
注 册:2006-3-5
得分:0 
以下是引用ヤ順祺冄繎ヤ在2006-3-9 9:05:00的发言:
#include<stdio.h>
#define N 3
main()
{int a[N][N];
int i,j,oi,oj,k;
for(i=0;i<N;i++)
for(j=0;j<N;j++)
a[i][j]=0; 这一句没有也行吧?
i=0;
j=(N-1)/2;
a[i][j]=1;
for(k=2;k<=N*N;k++)
{oi=i;
oj=j;
i--;
j++;
if(i<0) i=N+i;
if(j>N-1) j=0;
if(a[i][j]==0) a[i][j]=k;
else
{i=oi+1;
j=oj;
a[i][j]=k;}

}
for(i=0;i<N;i++)
{for(j=0;j<N;j++)
printf("%d\t ",a[i][j]);
printf("\n");
}

}


I am a programmer !
2006-03-10 07:07
ヤ順祺冄繎ヤ
Rank: 8Rank: 8
等 级:贵宾
威 望:42
帖 子:3032
专家分:0
注 册:2005-11-9
得分:0 
以下是引用Xxibug在2006-3-9 16:25:00的发言:

(-_-;),新版主直接给代码,考验楼主定力
单数幻方有个算法,搜一下就看到了

不好意思..我以为是找代码啊!!!
这是我高中的时候写的代码,以前学C没写过注释,望谅解!!!

2006-03-10 09:03



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




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

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