一种比较蠢的适合初学者的根据题意写的代码如下:
#include<iostream>
#include<cstdio>
using namespace std;
int a[40][40];
int main(){
int n,x[1600],y[1600];//x,y用来储存某个值的行数(从上到下)与列数(从左往右)
cin>>n;
for(int i=0;i<=n;i++){
a[0][i]=260408,a[i][0]=260408;//初始化第一行与第一列
}
a[1][n/2+1]=1;//填1
x[1]=1,y[1]=n/2+1;//1的坐标
for(int i=2;i<=n*n;i++){
//按要求依次填入:
//若(K-1)在第一行但不在最后一列,则将 K 填在最后一行,(K-1)所在列的右一列:
if(x[i-1]==1 && y[i-1]!=n){
a[n][y[i-1]+1]=i;
x[i]=n,y[i]=y[i-1]+1;
}
//若(K-1)在最后一列但不在第一行,则将 K 填在第一列,(K-1)所在行的上一行:
else if(y[i-1]==n && x[i-1]!=1){
a[x[i-1]-1][1]=i;
x[i]=x[i-1]-1,y[i]=1;
}
//若(K-1)在第一行最后一列,则将 K 填在(K-1)的正下方:
else if(a[1][n]==i-1){
a[2][n]=i;
x[i]=2,y[i]=n;
}
//若(K-1)既不在第一行,也不在最后一列,如果(K-1)的右上方还未填数,则将 K 填在(K-1)的右上方,否则将 K 填在(K-1)的正下方:
else if(x[i-1]!=1 && y[i-1]!=n){
if(a[x[i-1]-1][y[i-1]+1]==0){
a[x[i-1]-1][y[i-1]+1]=i;
x[i]=x[i-1]-1,y[i]=y[i-1]+1;
}
else{
a[x[i-1]+1][y[i-1]]=i;
x[i]=x[i-1]+1,y[i]=y[i-1];
}
}
}
//打印结果:
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++){
cout<<a[i][j]<<' ';
}
cout<<endl;
}
return 0;
}