求助!!!谭浩强的c语言教材上一道魔方阵的习题!!(答案错!)
谭浩强的C程序设计第3版习题7.7答案错,得不到正确结果。以下是我自己所编的程序,但结果也不对,我也查不出错误,请大家帮忙指正。
题目:输出魔方阵,所谓魔方阵是指这样的方阵,它的每一行、每一列和对角线之和均相等。例如,三阶魔方阵为
8 1 6
3 5 7
4 9 2
要求输出由1~n*n之间的自然数构成的魔方阵(n为奇数)
分析:
魔方阵中各数的排列规律如下:
1、将1放在第一行中间一列;
2、从2开始直到n*n止各数依次按下列规则存放:每一个数存放的行比前一个数的行数减一,列数加一(例如上面的三阶魔方阵,5在4的上一行
后一列);
3、如果上一行的行数为1,则下一个数的行数为n(指最下一行)。例如,1在第1行,则2应放在最下一行,列数同样加1;
4、当上一个数的列数为n时,下一个数的列数应为1,行数减1。例如,2在第3行最后一列,则3应放在第2行第1列;
5、如果按照上面规则确定的位置上已有数,或上一个数是第1行第n列时,则把下一个数放在上一个数的下面。例如,按上面的规定,4应该放
在第1行第二列,但该位置已被1占据,所以4就放在3的下面。由于6是第1行第3列(即最后一列),故7放在6下面。
按此方法可以得到任何阶的魔方阵。
我写的程序:
#include<stdio.h>
void main()
{
int l,m,k,j=1,n,temp1,temp2,flag1=0,flag2=0,i=1,a[16][16];
scanf("%d",&n);
j=n/2+1;
for(l=1;l<=n;l++)
for(m=1;m<=n;m++)
a[l][m]=0;
a[1][j]=1;
for(k=2;k<=n*n;k++)
{
if(i==1){temp1=i;i=n+1;flag1=1;}
if(j==n){temp2=j;j=0;flag2=2;}
if(a[i-1][j+1]==0)
{
a[i-1][j+1]=k;
i=i-1;j=j+1;
}
else
{
if(flag1==0&&flag2==0)
{
if(i==n)i=0;a[i+1][j]=k;i=i+1;
}
if(flag1==1&&flag2==2)
{
a[temp+1][temp2]=k;
i=temp+1;j=temp2;
}
if(flag1==1&&flag2==0)
{
a[temp1+1][j]=k;
i=temp1+1;flag1=0;
}
if(flag1==0&&flag2==2)
{
if(i==n)i=0;
a[i+1][temp2]=k;j=temp2;flag2=0;
}
}
}
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
printf("%d\t",a[i][j]);
printf("\n")
}
}
程序到此结束,但执行不出正确结果。尽管我写的程序繁琐,但我仍想知道为什么结果不对呢?
[[italic] 本帖最后由 阎魔瞳 于 2007-12-2 01:17 编辑 [/italic]]