#include<iostream>
using namespace std;
int main() {
int a[1001][1001]; //定义存储蛇形矩阵的数组
int n; //尺度
cin >> n;
int k = 1; //遍历n*n个数的计数器
int p = 0, q = 0; //当前数的位置坐标(均从0开始)
a[p][q] = 1; //从第一个元素开始,并赋初始值1
while (k < n * n) {
if (q + 1 < n) { //若右边有路则往右移动一个
q++;
a[p][q] = ++k;
}
else { //否则改变方向,向下(此时到达了蛇形数组的右边界)
p++;
a[p][q] = ++k;
}
do { //向左下方移动
p++;
q--;
a[p][q] = ++k;
} while (p + 1 < n && q - 1 >= 0);
if (p + 1 < n) { //若下面有路则往下移动一个
p++;
a[p][q] = ++k;
}
else { //否则改变方向,向右(此时到达了蛇形数组的下边界)
q++;
a[p][q] = ++k;
if (k == n * n) break; //注意到循环完的方向一定是向右的,需要附加限定条件,判断是否已经到达终点以跳出循环(调试了半天才发现,emo~)
}
do { //向右上方移动
p--;
q++;
a[p][q] = ++k;
} while (p - 1 >= 0 && q + 1 < n);
}
// 打印蛇形数组
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
cout << a[i][j] << " ";
}
cout << endl;
}
return 0;
}