#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; int check_value(int prev, int next) { if (prev < 0) return next; if (next < 0) return prev; return min(prev, next); } int traverse_board(int n, int a, int b, int x, int y, int cnt, int current_winner, map > visited) { if (x < 0 || y < 0 || x >= n || y >= n || current_winner >= 0 && cnt >= current_winner) { return -1; } if (x == n - 1 && y == n - 1) { return cnt; } map >::iterator xit = visited.find(x); if (xit != visited.end() && xit->second.find(y) != xit->second.cend()) { return -1; } if (xit == visited.end()) xit = visited.insert(make_pair(x, set())).first; xit->second.insert(y); if (a == b) { if (x + 2 * a < n && y + 2 * b < n) { return check_value(current_winner, traverse_board(n, a, b, x + a, y + b, cnt + 1, current_winner, visited)); } int res = check_value(current_winner, traverse_board(n, a, b, x + a, y + b, cnt + 1, current_winner, visited)); res = check_value(res, traverse_board(n, a, b, x - a, y + b, cnt + 1, res, visited)); res = check_value(res, traverse_board(n, a, b, x + a, y - b, cnt + 1, res, visited)); res = check_value(res, traverse_board(n, a, b, x - a, y - b, cnt + 1, res, visited)); return res; } if (x + 2 * a < n && y + 2 * b < n && x + 2 * b < n && y + 2 * a < n) { int res = check_value(current_winner, traverse_board(n, a, b, x + a, y + b, cnt + 1, current_winner, visited)); return check_value(res, traverse_board(n, a, b, x + b, y + a, cnt + 1, res, visited)); } int res = check_value(current_winner, traverse_board(n, a, b, x + a, y + b, cnt + 1, current_winner, visited)); res = check_value(res, traverse_board(n, a, b, x + b, y + a, cnt + 1, res, visited)); res = check_value(res, traverse_board(n, a, b, x - a, y + b, cnt + 1, res, visited)); res = check_value(res, traverse_board(n, a, b, x + a, y - b, cnt + 1, res, visited)); res = check_value(res, traverse_board(n, a, b, x - b, y + a, cnt + 1, res, visited)); res = check_value(res, traverse_board(n, a, b, x + b, y - a, cnt + 1, res, visited)); res = check_value(res, traverse_board(n, a, b, x - a, y - b, cnt + 1, res, visited)); res = check_value(res, traverse_board(n, a, b, x - b, y - a, cnt + 1, res, visited)); return res; } int main(){ int n; cin >> n; // your code goes here for (int a = 1; a < n; ++a) { for (int b = 1; b < n; ++b) { int result = traverse_board(n, a, b, 0, 0, 0, -1, map >()); cout << result << " "; } cout << endl; } return 0; }