2024-10-01 13:38:46 +00:00
|
|
|
|
#include <iostream>
|
|
|
|
|
#include <istream>
|
2024-10-01 16:00:28 +00:00
|
|
|
|
#include <ranges>
|
2024-10-01 13:38:46 +00:00
|
|
|
|
|
|
|
|
|
using std::cin,std::cout;
|
2024-10-01 16:00:28 +00:00
|
|
|
|
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};
|
2024-10-01 13:38:46 +00:00
|
|
|
|
|
|
|
|
|
int main(){
|
2024-10-01 14:03:35 +00:00
|
|
|
|
std::iostream::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr);
|
2024-10-01 13:38:46 +00:00
|
|
|
|
|
2024-10-01 16:00:28 +00:00
|
|
|
|
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<<map[i][j]<<" ";
|
|
|
|
|
}
|
|
|
|
|
std::cout<<"\n";
|
|
|
|
|
}
|
2024-10-01 13:38:46 +00:00
|
|
|
|
}
|