69,373
社区成员
发帖
与我相关
我的任务
分享
#include <stdio.h>
#define N 16
int main()
{
int a[N][N]={0},i,j,k,p,m,n;
p=1;
while(p==1)
{
printf("Enter n(1~%d):",N-1);
scanf("%d",&n);
if((n!=0) && (n <N) && (n%2!=0)) //1~n的奇数
p=0;
}
i=n+1;
j=n/2+1;
a[1][j]=1; //第一行中间列为 1
for(k=2;k <=n*n;k++) //从第二个数到第n*n个数
{
i=i-1; //规则一: 从2开始直到n×n止各数依次按下列规则存放;每一个数存放的行比前一个数的行数减1,列数加1
j=j+1;
if((i <1) && (j>n)) //上一个数是第一行第n列时,则把下一个数放在上一个数的下面
{
i=i+2;
j=j-1;
}
else
{
if(i <1) i=n; //如果上一个数的行数为1,则下一个数的行数为n(指最下一行)
if(j>n) j=1; //当上一个数的列数为n时,下一个数的列数应为1,行数减去1 //继续迷茫。。。谁帮我解释下?
}
if(a[i][j]==0) a[i][j]=k;
else //如果按上面规则确定的位置上已有数,则把下一个数放在上一个数的下面
{
i=i+2;
j=j-1;
a[i][j]=k;
}
}
for(i=1;i <=n;i++)
{
for(j=1;j <=n;j++)
printf("%4d",a[i][j]);
printf("\n");
}
return 0;
}