#include <stdio.h>
int main() {
int n;
scanf("%d", &n);
int matrix[1000][1000] = {0}; // n最大1000
int num = 1;
int i = 0, j = 0;
int direction = 1; // 1表示向右上移动,-1表示向左下移动
while (num <= n * n) {
matrix[i][j] = num++;
// 根据当前方向计算下一个位置
if (direction == 1) { // 向右上移动
if (j == n - 1) { // 碰到右边界,向下移动
i++;
direction = -1;
} else if (i == 0) { // 碰到上边界,向右移动
j++;
direction = -1;
} else { // 继续向右上
i--;
j++;
}
} else { // 向左下移动
if (i == n - 1) { // 碰到下边界,向右移动
j++;
direction = 1;
} else if (j == 0) { // 碰到左边界,向下移动
i++;
direction = 1;
} else { // 继续向左下
i++;
j--;
}
}
}
// 输出矩阵
for (int x = 0; x < n; x++) {
for (int y = 0; y < n; y++) {
printf("%d", matrix[x][y]);
if (y < n - 1) printf(" ");
}
printf("\n");
}
return 0;
}