#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; const int MAXN = 25; const int MAXV = 10000; int m[MAXN][MAXN]; void clear(int n) { for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { m[i][j] = MAXV; } } } bool avail(int x, int y, int n) { if (x < 0 || x >= n || y < 0 || y >= n) { return false; } return m[x][y] == MAXV; } void fill(int a, int b, int n, int x, int y, int value) { if (avail(x + a, y + b, n)) { m[x + a][y + b] = value; } if (avail(x - a, y + b, n)) { m[x - a][y + b] = value; } if (avail(x + a, y - b, n)) { m[x + a][y - b] = value; } if (avail(x - a, y - b, n)) { m[x - a][y - b] = value; } if (avail(x + b, y + a, n)) { m[x + b][y + a] = value; } if (avail(x - b, y + a, n)) { m[x - b][y + a] = value; } if (avail(x + b, y - a, n)) { m[x + b][y - a] = value; } if (avail(x - b, y - a, n)) { m[x - b][y - a] = value; } } int main(){ int n; cin >> n; for (int a = 1; a < n; a++) { for (int b = 1; b < n; b++) { clear(n); int color = 1; fill(a, b, n, 0, 0, color); for (int color = 1; color < n*n && avail(n - 1, n - 1, n); color++) { for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { if (m[i][j] == color) { fill(a, b, n, i, j, color + 1); } } } } cout << (avail(n - 1, n - 1, n)? -1 : m[n - 1][n - 1]) << " "; } cout << endl; } return 0; }