#include using namespace std; vector> solve(int N) { vector> magic(N, vector(N)); if (N & 1) { int i = 0, j = N / 2, num = 1; while (num <= N * N) { magic[i][j] = num++; (i += N - 1) %= N; (j += 1) %= N; if (magic[i][j]) (i += 2) %= N, (j += N - 1) %= N; } } else if (N % 4 == 0) { for (int i = 0; i < N; i++) { for (int j = 0; j < N; j++) { magic[i][j] = i * N + j + 1; } } for (int i = 0; i < N; i++) { for (int j = 0; j < N / 2; j++) { if (i % 4 == j % 4 || i % 4 == 3 - (j % 4)) swap(magic[i][j], magic[N - 1 - i][N - 1 - j]); } } } else { auto origin = solve(N / 2); for (auto& V : origin) for (auto& x : V) (x -= 1) *= 4; int LUX[3][2][2] = {{{4, 1}, {2, 3}}, {{1, 4}, {2, 3}}, {{1, 4}, {3, 2}}}; auto lux = [](int N, int i, int j) { if (i > N / 2 + 1) return 2; if ((i == N / 2 && j == N / 2) || (i == N / 2 + 1 && j != N / 2)) return 1; return 0; }; for (int i = 0; i < N / 2; i++) { for (int j = 0; j < N / 2; j++) { for (int k = 0; k < 2; k++) { for (int l = 0; l < 2; l++) { magic[i * 2 + k][j * 2 + l] = origin[i][j] + LUX[lux(N / 2, i, j)][k][l]; } } } } } return magic; } int main() { int N; cin >> N; auto magic = solve(N); for (int i = 0; i < N; i++) { for (int j = 0; j < N; j++) { cout << magic[i][j] << " "; } cout << endl; } }