using System; class Program { static void Main(string[] args) { //入力 int N = int.Parse(Console.ReadLine()); //回答用の配列を用意 int[,] A = new int[N, N]; //すべての値を0にセットする for (int i = 0; i < N; i++) { for (int j = 0; j < N; j++) { A[i, j] = 0; } } //まずは周辺を埋めていく for (int yoko = 0; yoko < N; yoko++) { A[0, yoko] = yoko + 1; A[N - 1, yoko] = 3 * N - 2 - yoko; } if (N >= 2) { for (int tate = 1; tate < N - 1; tate++) { A[tate, 0] = 4 * N - 3 - tate; A[tate, N - 1] = N + tate; } } if (N <= 2) { goto END; } A[1, 1] = 4 * N - 3; //埋めていくための数字 int let = 4 * N - 3; //一つずつ埋めていく(ここでiは、埋めていく順番の番号を表す) for (int i = 0; i < (N - 2) * (N - 2); i++) { for (int tate = 1; tate < N - 1; tate++) { for (int yoko = 1; yoko < N - 1; yoko++) { if (A[tate, yoko] == let) { //下にムーブ if (A[tate, yoko + 1] != 0 && A[tate - 1, yoko] != 0 && A[tate + 1, yoko] == 0) { A[tate + 1, yoko] = let + 1; let++; } else //左にムーブ if (A[tate, yoko + 1] != 0 && A[tate + 1, yoko] != 0 && A[tate, yoko - 1] == 0) { A[tate, yoko - 1] = let + 1; let++; } else //上にムーブ if (A[tate, yoko - 1] != 0 && A[tate + 1, yoko] != 0 && A[tate - 1, yoko] == 0) { A[tate - 1, yoko] = let + 1; let++; } else //右にムーブ if (A[tate, yoko - 1] != 0 && A[tate - 1, yoko] != 0 && A[tate, yoko + 1] == 0) { A[tate, yoko + 1] = let + 1; let++; } } if (let == N * N) { goto END; } } } } END: //出力 for (int i = 0; i < N; i++) { for (int j = 0; j < N; j++) { if (A[i, j].ToString().Length == 1) { Console.Write("00" + A[i, j] + " "); } else if (A[i, j].ToString().Length == 2) { Console.Write("0" + A[i, j] + " "); } else if (A[i, j].ToString().Length == 3) { Console.Write(A[i, j] + " "); } } Console.WriteLine(); } } }