#include<iostream>
using namespace std;
/*
1、首先将1填在方阵的第一行的中间,即(1,(n+1)/2)的位置。
2、下一个数填在上一个数的主对角线的上方,若上一个数的位置是(i,j)。下一个数为(i-1,j-1)
3、若应填写的位置下标出界,则出界的值用n来替代
4、若应填写的位置虽然没有出界,但是已经填有数据的话,则应填写在上一个数的下面,即(i+1,j)
*/
int main()
{
int n;
cin>>n;
int a[257][257];
int i,j,k,t;
int x;
int i1,j1;
x=1;
i=1;
j=(n+1)/2;
for(k=1;k<257;k++)
for(t=1;t<257;t++)
a[k][t]=0;
while(x<=n*n)
{
a[i][j]=x;
x++;
i1=i;
j1=j;
i=i-1;
j=j-1;
if(i==0)
i=n;
if(j==0)
j=n;
if(a[i][j]!=0)
{
i=i1+1;
j=j1;
}
}
for(k=1;k<=n;k++)
{
for(t=1;t<=n;t++)
cout<<a[k][t]<<" ";
cout<<endl;
}
return 0;
}
转载于:https://blog.51cto.com/moqifei/728044