#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;
}