标题:[求助] 谭浩强C课后习题------魔方阵
只看楼主
changyi5757
Rank: 1
等 级:新手上路
帖 子:35
专家分:0
注 册:2005-7-31
 问题点数:0 回复次数:8 
[求助] 谭浩强C课后习题------魔方阵

所谓魔方阵是指它的每一行,每一列和对角线之和均相等. 三阶魔方阵为: 8 1 6 3 5 7 4 9 2 下面就是我编写的三阶魔方阵的程序,但是没有运行结果,请高手帮助,看看我的程序什么地方有错 main() { int i,j,k,sum1,sum2,sum3,sum4; int a[3][3];

sum1=0;sum2=0;sum3=0;sum4=0;k=0;

for(i=0;i<3;i++) for(j=0;j<3;j++) { if(i==j)sum1=sum1+a[i][j]; sum1和sum2表示对角线之和 if(i==2-j)sum2=sum2+a[i][j]; } if(sum1==sum2) { for(i=0;i<3;i++) { for(j=0;j<3;j++) { sum3=sum3+a[i][j]; sum3表示一行之和 sum4=sum4+a[j][i]; sum4表示一列之和 } if(sum3==sum4&&sum3==sum2) {sum3=0;sum4=0;k++;} } }

if(k==3) k=3表示3行3列都相等 {for(i=0;i<3;i++) for(j=0;j<3;j++) { printf("%2d",a[i][j]); printf("\n");} } }

搜索更多相关主题的帖子: 谭浩强 魔方 习题 int 
2005-07-31 10:38
天籁雨声
Rank: 1
等 级:新手上路
帖 子:57
专家分:0
注 册:2005-6-28
得分:0 
我明白你的意思,不管矩阵的大小如何变换,始终对称。
但是,你可以把你的思路说一下吗,这样看得真是很费解。

游四海,交天下知己!
2005-07-31 12:15
天籁雨声
Rank: 1
等 级:新手上路
帖 子:57
专家分:0
注 册:2005-6-28
得分:0 
最怕找的错误就是逻辑错误。很郁闷的。

游四海,交天下知己!
2005-07-31 12:17
anycall628
Rank: 1
等 级:新手上路
帖 子:222
专家分:0
注 册:2005-2-18
得分:0 
只定义了二维数组,没有符值的过程怎么判断呢?

爱生活,爱编程。
2005-07-31 12:57
changyi5757
Rank: 1
等 级:新手上路
帖 子:35
专家分:0
注 册:2005-7-31
得分:0 
请问你说的符值是对哪个符值,能否说清楚点
2005-07-31 14:13
anycall628
Rank: 1
等 级:新手上路
帖 子:222
专家分:0
注 册:2005-2-18
得分:0 
你把a[i][j]斜着累加,横着累加.....
每一个a[i][j]的值从那里取呢?少一个从1~9取数,而且不能重复的过程吧

爱生活,爱编程。
2005-07-31 20:36
seeker
Rank: 1
等 级:新手上路
帖 子:172
专家分:0
注 册:2005-6-5
得分:0 

首先把从1~n2的整数按从小到大的顺序排列成一个n×n的方阵A进行观察。(本文中所有n都是指大于1的奇数,下文中均以“A”代表这类顺序排列的n×n方阵) 以5阶阵为例:以下是A方阵 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 下边是魔方阵B: 12 16 25 4 8 6 15 19 23 2 5 9 13 17 21 24 3 7 11 20 18 22 1 10 14 先假设n阶奇次魔方阵B是存在的,从A中可以看出,B的任一元素在A中都有唯一确定的行号和列号组合(y,x)。 分离出B中所有元素在A中的行号y来构成n×n方阵I,让I(i,j)等于从B(i,j)分离出来的y;(如I(1,1) =3,即12在A中的行号A(3,2);I(1,2)=4,即16在A中的行号A(4,1)。)以下是I方阵: 3 4 5 1 2 2 3 4 5 1 1 2 3 4 5 5 1 2 3 4 4 5 1 2 3 同样分离出B中所有元素在A中的列号y来构成n×n方阵J,让J(i,j)等于从B(i,j)分离出来的x。以下是J方阵 2 1 5 4 3 1 5 4 3 2 5 4 3 2 1 4 3 2 1 5 3 2 1 5 4 观察方阵I特征为: 1.组成方阵的数为1~n的整数; 2.任一行、列均遍历1~n的所有整数; 3.主对角线上的数均为(n+1)/2,辅对角线遍历1~n的所有整数。 方阵J特征前两点同I,区别是第三点,辅对角线上的数均为(n+1)/2,主对角线遍历1~n的所有整数。 另外还有容易忽略的一点,I、J方阵对应位置上的数字组合[I(i,j),J(i,j)]是唯一的。  综合以上的结论可以知道:B(i,j)=(I(i,j)-1)×n+J(i,j)。所以只要构造出这样两个只含1~n的数的方阵I和J,就可以确定一个n×n的魔方阵。 现在,问题就转化为怎样构造分别满足I和J的特征的两个n×n方阵。其实完成这样的算法是很简单的,可以按以下方法实现: 1) 方阵I的第一行由(n+1)/2打头,后面依次为前一个数关于n的循环后继; 2)方阵I的第i+1行由第i行循环右移得到。 本人给出的程序:

*/

main() { int n,i,j; int a[20][20],x[20][20],y[20][20];/* a数组为最后结果数组文中的B方阵,X,Y分别是文中提到的数组I,J*/ printf("please input the number N:"); scanf("%d",&n); /*输入需要的数组维数*/ x[0][0]=(n+1)/2; for(j=1;j<n;j++) { if(x[0][j-1]==n) x[0][j]=x[0][j-1]+1-n; else x[0][j]=x[0][j-1]+1; }/*给x中的第一行元素赋值*/ for(i=1;i<n;i++) for(j=0;j<n;j++) { if(j-1<0) x[i][j]=x[i-1][j-1+n]; else x[i][j]=x[i-1][j-1]; } /*通过变换给X的所有元素赋值*/ clrscr(); printf("X:\n"); for(i=0;i<n;i++) for(j=0;j<n;j++) { printf("%3d",x[i][j]); if(j==n-1)printf("\n"); }/*输出X数组*/ for(i=0;i<n;i++) for(j=0;j<n;j++) y[i][j]=x[i][n-1-j];/*通过文中提到的公式给Y数组赋值*/ printf("Y:\n"); for(i=0;i<n;i++) for(j=0;j<n;j++) {printf("%3d",y[i][j]); if(j==n-1)printf("\n"); }/*输出Y数组*/ for(i=0;i<n;i++) for(j=0;j<n;j++) a[i][j]=(x[i][j]-1)*n+y[i][j]; printf("A:\n"); for(i=0;i<n;i++) for(j=0;j<n;j++) {printf("%5d",a[i][j]); if(j==n-1)printf("\n");} /*输出A数组结果*/ }


我相信总有一片天空属于我!http://myseeker. E-Mail:lwqcny@
2005-08-01 22:54
aafg剑心
Rank: 1
等 级:新手上路
帖 子:56
专家分:0
注 册:2005-6-12
得分:0 
没有前提条件啊,莫名其妙  呵呵

世事如舟挂短篷,或移西岸或移东。 几回缺月还圆月,数阵南风又北风。 岁久人无千日好,春深花有几时红。 是非入耳君须忍,半作痴呆半作聋。
2005-08-01 23:13



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




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

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