#include <iostream> #include <list> static int distance[26][26] = {{0}}; class Pos { public: unsigned x; unsigned y; Pos(unsigned a, unsigned b) : x(a), y(b) {}; }; bool insert_move(std::list<Pos>& pq, int d[26][26], unsigned n, unsigned x, unsigned y, int v) { if(x < 1 || x > n || y < 1 || y > n || d[x][y] != 0) return false; d[x][y] = v; pq.emplace_back(x, y); return x==1 && y==1; } bool insert_all_moves(std::list<Pos>& pq, int d[26][26], unsigned n, unsigned x, unsigned y, unsigned d1, unsigned d2) { if(insert_move(pq, d, n, x-d1, y-d2, d[x][y]+1)) return true; if(insert_move(pq, d, n, x-d1, y+d2, d[x][y]+1)) return true; if(insert_move(pq, d, n, x+d1, y-d2, d[x][y]+1)) return true; if(insert_move(pq, d, n, x+d1, y+d2, d[x][y]+1)) return true; if(insert_move(pq, d, n, x-d2, y-d1, d[x][y]+1)) return true; if(insert_move(pq, d, n, x-d2, y+d1, d[x][y]+1)) return true; if(insert_move(pq, d, n, x+d2, y-d1, d[x][y]+1)) return true; if(insert_move(pq, d, n, x+d2, y+d1, d[x][y]+1)) return true; return false; } unsigned knight_moves(unsigned n, unsigned i, unsigned j) { int d[26][26] = {{0}}; std::list<Pos> pq; pq.emplace_back(n, n); int res = -1; while(!pq.empty()) { Pos p = pq.front(); pq.pop_front(); if(insert_all_moves(pq, d, n, p.x, p.y, i, j)) break; } return (d[1][1] == 0 ? -1 : d[1][1]); } int main() { unsigned n; std::cin >> n; int solution[26][26] = {{0}}; for(unsigned i=1; i<n; ++i) { for(unsigned j=1; j<i; ++j) solution[i][j] = solution[j][i]; solution[i][i] = ((n-1)%i == 0 ? (n-1)/i : -1); for(unsigned j=i+1; j<n; ++j) solution[i][j] = knight_moves(n, i, j); } for(unsigned i=1; i<n; ++i) { for(unsigned j=1; j<n-1; ++j) std::cout << solution[i][j] << " "; std::cout << solution[i][n-1] << std::endl; } return 0; }