#include #include #include using std::cin,std::cout; static constexpr const auto range = std::ranges::views::iota; const int MAX_N = 39+5; int n; int map[MAX_N][MAX_N]; int x,y,now{1}; int main(){ std::iostream::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr); std::cin>>n; x=1,y=n/2+1; map[x][y]=now++; /* 1. 若 $(K-1)$ 在第一行但不在最后一列,则将 $K$ 填在最后一行, $(K-1)$ 所在列的右一列; 2. 若 $(K-1)$ 在最后一列但不在第一行,则将 $K$ 填在第一列, $(K-1)$ 所在行的上一行; 3. 若 $(K-1)$ 在第一行最后一列,则将 $K$ 填在 $(K-1)$ 的正下方; 4. 若 $(K-1)$ 既不在第一行,也不在最后一列,如果 $(K-1)$ 的右上方还未填数,则将 $K$ 填在 $(K-1)$ 的右上方,否则将 $K$ 填在 $(K-1)$ 的正下方。 */ while(now<=n*n){ if(x==1 && y!=n){ x=n,y++; }else if(y==n && x!=1){ y=1,x--; }else if(x==1 && y==n){ x++; }else if(x!=1 && y!=n){ if(map[x-1][y+1]==0){ x--; y++; }else{ x++; } } map[x][y]=now++; } for(int i:range(1,n+1)){ for(int j:range(1,n+1)){ std::cout<