module main; // https://ja.wikipedia.org/wiki/魔方陣 より // 奥村晴彦氏のアルゴリズム本より import std; void main() { // 入力 int N = readln.chomp.to!int; // 答えの計算 auto ans = new int[][](N, N); // N が奇数の場合 if (N % 2) { int k = 0; foreach (i; -N / 2 .. N / 2 + 1) foreach (j; 0 .. N) ans[(j - i + N) % N][(j + i + N) % N] = ++k; } // N = 4n の場合 else if (N % 4 == 0) { foreach (i; 0 .. N) foreach (j; 0 .. N) { int k = i % 4, l = j % 4; if (k == l || k + l == 3) ans[i][j] = i * N + j + 1; else ans[i][j] = (N - i) * N - j - 2; } } // N = 4n + 2 の場合 else if (N % 4 == 2) { int M = N / 2; auto sub = new int[][](M, M); int a = 0; foreach (i; -M / 2 .. M / 2 + 1) foreach (j; 0 .. M) sub[(j - i + M) % M][(j + i + M) % M] = ++a; foreach (ref row; sub) { --row[]; row[] *= 4; } auto LUX = [ [[4,1],[2,3]], [[1,4],[2,3]], [[1,4],[3,2]] ]; auto idx = new int[][](M, M); idx[M / 2][M / 2] = 1; idx[M / 2 + 1][] = 1; idx[M / 2 + 1][M / 2] = 0; foreach (i; M / 2 + 2 .. M) idx[i][] = 2; foreach (i; 0 .. M) { foreach (j; 0 .. M) { foreach (k; 0 .. 2) { foreach (l; 0 .. 2) { ans[2 * i + k][2 * j + l] = sub[i][j] + LUX[idx[i][j]][k][l]; } } } } } // 答えの出力 writefln("%(%(%d %)\n%)", ans); }