| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2618 人关注过本帖
标题:有关魔方矩阵的思路问题,向各位请教
只看楼主 加入收藏
xueyuanqingdao
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2005-5-1
收藏
 问题点数:0 回复次数:10 
有关魔方矩阵的思路问题,向各位请教
碰到一个有关“魔方矩阵”的编程问题,魔方矩阵:由1~n*n个自然数构成的n阶方阵,特点是,各行各列以及对角线之和均相等。例如:n=2时,不存在;当n>=3时,对于n=3,矩阵为,a[3][3]={{8,1,6},{3,5,7},{4,9,2}}.请问如何编写程序描述n阶“魔方矩阵”
搜索更多相关主题的帖子: 魔方 矩阵 思路 
2005-05-01 17:23
激情依旧
Rank: 1
等 级:新手上路
威 望:2
帖 子:524
专家分:0
注 册:2005-4-4
收藏
得分:0 
你去数据结构论坛那里看 [热情依旧] 发的 [幻方] 的帖子

幻方是一个方形整数数组,它每行的和,每列的和及两条对角线上的和全部相等,下面的图1.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

(1)编写程序读一个正方形整数数组,并判断它是否一个幻方。

(2)编写程序用下面的方法生成一个幻方,此方法仅当正方形大小是奇数时可用。开始时将1放在顶行的中间 位置,将后续整数2,3,....分别写入前个数字所在位置的上行偏右一格。当到达顶行时(比如1就在顶 行),返回到底行继续前进,就好像底行是直接在顶行上面一样。当到达最右列的时,继续到最左列,就好 像最左列直接在最右列的右边。当到达的位置已被占据时,就直接在前一个数的下面位置处插入新数。按照 这种方法构造的5×5幻方如图1.5中所示。 #include<iostream> using namespace std; //本程序按照题目的排序方法打印出幻方 //2005年4月24日 3:10 void main(){

int **a,i,j,count=1,n,m,flag=0;//count是计算器,用来计算输入数字的个数,flag是标记,n,m分别是首个数字的插入位置 int b[255],N,sum=0,count1; //数组B是来分别记录行,列,对角线元素的总和 cout<<"please input the N control the array long and width:\n";//输入N为二维数组,N一定要为奇数 cin>>N; a=new int*[N]; //动态分配数组 for(i=0;i<N;i++) a[i]=new int[N]; for(i=0;i<N;i++) for(j=0;j<N;j++) a[i][j]=0;//数组空时全置0 count1=N*N; n=0; m=N/2; a[n][m]=1; count++; while(count<=count1){ cout<<"please intput the "<<count<<"th number:\n";//输入2-25,一定要按照递增输入即是(2,3,4,5,6,7。。。。。25) if(n==0&&m!=N-1){//当当前位置是第0行并且不是第4列 n=N-1; if(a[n][m+1]==0) flag=1; //当要插入的位置没有数字时 if(flag==1) { m++; fflush(stdin); cin>>a[n][m]; flag=0; count++; } else{ //当当前位置有已经数字时,在当前位置的前一个数插入 n++; fflush(stdin);//用来消去输入数字按的空格 cin>>a[n][m]; count++; } } else if(m==N-1&&n!=0&&n!=N-1){//当当前位置是第4列并且不是第0行跟第4行时 m=0; if(a[n-1][m]==0) flag=1; if(flag==1) {n--; fflush(stdin); cin>>a[n][m]; flag=0; count++; } else{ n++; m=N-1; fflush(stdin); cin>>a[n][m]; count++; } } else if(m==N-1&&n==0)//当当前位置是第4列并且是第0行 { m=0; n=N-1; if(a[n][m]==0) flag=1; if(flag==1) { fflush(stdin); cin>>a[n][m]; flag=0; count++; } else{ n=1; m=N-1; fflush(stdin); cin>>a[n][m]; count++; } } else if(m==N-1&&n==N-1)//当当前位置时第4列并且是第4行时 { m=0; if(a[n-1][m]==0) flag=1; if(flag==1) { n--; fflush(stdin); cin>>a[n][m]; flag=0; count++; } else{ m=N-1; n=0; fflush(stdin); cin>>a[n][m]; count++; } } else{//当是其他位置时 if(a[n-1][m+1]==0) flag=1; if(flag==1){ n--; m++; fflush(stdin); scanf("%d",&a[n][m]); flag=0; count++; } else{ n++; fflush(stdin); cin>>a[n][m]; count++; } } } cout<<"output the array:\n"; for(i=0;i<N;i++) for(j=0;j<N;j++) { if(j%N==0) cout<<endl; cout<<a[i][j]<<'\t'; } cout<<endl; count=0; for(i=0;i<N;i++)//计算行的总和 for(j=0;j<N;j++) { sum+=a[i][j]; b[count++]=sum; sum=0; } for(j=0;i<N;i++)//计算列的总和 for(i=0;j<N;j++) {sum+=a[i][j]; b[count++]=sum; sum=0; } for(i=0;i<N;i++)//计算对角线总和 for(j=0;j<i;j++) sum+=a[i][j]; b[count++]=sum; sum=0; for(i=0;i<N;i++)//计算对角线总和 for(j=N-1;j>N-i;j--) sum+=a[i][j]; b[count++]=sum; flag=0; for(i=0;i<count;i++) if(b[0]==b[i])//判断行,列,对角线是否相等,相等就是幻方,不相等就不是! flag=1; if(flag==1) cout<<"the array is dream square!"<<endl; else cout<<"the array is not dream square!"<<endl; for (int i=0;i<N;i++) delete[] a[i]; //注意撤销次序,先列后行,与设置相反 delete[] a; } 我加了详细的注释,希望不会这道题目的人可以看明白


生是编程人!!!!死是编程鬼!!!!颠峰人生!!!焚尽编程!!! 爱已严重死机!情必须重新启动!情人已和服务器断开连接!网恋也需要重新拨号!-----激情依旧
2005-05-03 20:45
xueyuanqingdao
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2005-5-1
收藏
得分:0 
think you very much.
感问仁兄,从事程序工作多久了

2005-05-04 20:36
神vLinux飘飘
Rank: 13Rank: 13Rank: 13Rank: 13
来 自:浙江杭州
等 级:贵宾
威 望:91
帖 子:6140
专家分:217
注 册:2004-7-17
收藏
得分:0 
幻方是有一个规律的

N阶幻方的规律又分为奇数类和偶数类

不知道大家的高中老师讲过没?

淘宝杜琨
2005-05-04 20:51
xueyuanqingdao
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2005-5-1
收藏
得分:0 
我的高中时期,还没接触过,矩阵呢。可能真的落后时代了。哈哈

2005-05-06 12:30
激情依旧
Rank: 1
等 级:新手上路
威 望:2
帖 子:524
专家分:0
注 册:2005-4-4
收藏
得分:0 
不是我写的。是我师傅热情写的。你可以去数据结构论坛看他写的。就知道什么叫经典!!!他和我一样。是大二学生。。他发的帖子不会随便说说两句就算的。都有上机验证过的程序。可以直接复制下来运行的。我看了论坛那么多人发的帖子。应该没有人可以和他比~~~~~~

生是编程人!!!!死是编程鬼!!!!颠峰人生!!!焚尽编程!!! 爱已严重死机!情必须重新启动!情人已和服务器断开连接!网恋也需要重新拨号!-----激情依旧
2005-05-07 09:57
xueyuanqingdao
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2005-5-1
收藏
得分:0 
大二的学生已经有这种水平了,哎,江山代有才人出。。。。。佩服。

2005-05-07 19:23
激情依旧
Rank: 1
等 级:新手上路
威 望:2
帖 子:524
专家分:0
注 册:2005-4-4
收藏
得分:0 
我不敢说热情是非常聪明的人。但敢说他是毅力非常坚强的人。他求知的欲望和求胜的欲望非常强。有那种不达目的绝不罢休的精神。。。。他学的也非常痛苦。因为没有老师的教导。他都是自学的。他自学后在教会我~~~~~~所以我说他是我师傅。我入门多亏他帮忙。要不现在还沉沦于苦海~~~~~~~~

生是编程人!!!!死是编程鬼!!!!颠峰人生!!!焚尽编程!!! 爱已严重死机!情必须重新启动!情人已和服务器断开连接!网恋也需要重新拨号!-----激情依旧
2005-05-08 07:25
wanwan520
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2005-4-17
收藏
得分:0 
激情依旧,你师傅是哪位拉... 让大家都认识一下下拉.....
2005-05-08 17:47
xueyuanqingdao
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2005-5-1
收藏
得分:0 
人不奋斗枉少年呀,看来,我需要更加努力了

2005-05-09 16:34
快速回复:有关魔方矩阵的思路问题,向各位请教
数据加载中...
 
   



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

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