题目大意为:输入一个奇数整数n,输出一个由1-n*n组成的矩阵中每个数都不相同且每行每列和两个对角线上每个元素的和都为奇数。
此题有两个需要注意的地方:
1:1这个数放在第一行最中间一列。
2:从1-n*n,每个数放在前一个数的右上角,即行加1,列减1(特判:上一个数在第一行第n列的时候,这个数应该在第二行第n列)。如果越界,即上个数行是1,列不为n,这个数行为n,列加1;上个数列为n,行不为1,这个数列为1,行加1.
#include<stdio.h>
#include<string.h>
#include<algorithm>
#define N 500
using namespace std;
int ans[N][N];
int main()
{
int n,m,i,j,k,x,y,tx,ty;
scanf("%d",&n);
m=n*n;
x=1,y=n/2+1;
ans[x][y]=1;
for(i=2; i<=m; i++)
{
if(x==1&&y!=n)
{
tx=n,ty=y+1;
}
else if(y==n&&x!=1)
{
tx=x-1,ty=1;
}
else if(x==1&&y==n)
{
tx=x+1,ty=y;
}
else
{
if(ans[x-1][y+1])
tx=x+1,ty=y;
else
tx=x-1,ty=y+1;
}
ans[tx][ty]=i;
x=tx,y=ty;
}
for(i=1; i<=n; i++)
{
for(j=1; j<=n; j++)
{
printf("%d ",ans[i][j]);
}
puts("");
}
return 0;
}