判断魔方矩阵c语言程序,有关魔方矩阵的思路问题,向各位请教

你去数据结构论坛那里看 [热情依旧] 发的 [幻方] 的帖子

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

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<

cin>>N;

a=new int*[N]; //动态分配数组

for(i=0;i

a[i]=new int[N];

for(i=0;i

for(j=0;j

a[i][j]=0;//数组空时全置0

count1=N*N;

n=0;

m=N/2;

a[n][m]=1;

count++;

while(count<=count1){

cout<

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<

for(i=0;i

for(j=0;j

{ if(j%N==0)

cout<

cout<

}

cout<

count=0;

for(i=0;i

for(j=0;j

{ sum+=a[i][j];

b[count++]=sum;

sum=0;

}

for(j=0;i

for(i=0;j

{sum+=a[i][j];

b[count++]=sum;

sum=0;

}

for(i=0;i

for(j=0;j

sum+=a[i][j];

b[count++]=sum;

sum=0;

for(i=0;i

for(j=N-1;j>N-i;j--)

sum+=a[i][j];

b[count++]=sum;

flag=0;

for(i=0;i

if(b[0]==b[i])//判断行,列,对角线是否相等,相等就是幻方,不相等就不是!

flag=1;

if(flag==1)

cout<

else cout<

for (int i=0;i

delete[] a;

}

我加了详细的注释,希望不会这道题目的人可以看明白

em01.gif

em01.gif

13a2f4bd84d8af35e7645442bb7a26a3.gif

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值