#include <map> #include <set> #include <list> #include <cmath> #include <ctime> #include <deque> #include <queue> #include <stack> #include <string> #include <bitset> #include <cstdio> #include <limits> #include <vector> #include <climits> #include <cstring> #include <cstdlib> #include <fstream> #include <numeric> #include <sstream> #include <iostream> #include <algorithm> #include <unordered_map> using namespace std; bool valid(int x, int y, int N, int M) { if (x < 0 || y < 0 || x >= N || y >= M) return false; return true; } int bfs(pair<int, int> p1, pair<int, int> p2, pair<int, int> p3, pair<int, int> p4) { int N = p3.first; int M = p3.second; queue<pair<pair<int, int>, int> > Que; map<pair<int, int>, bool> Vis; int dx = p4.first; int dy = p4.second; int ddx[8] = {dx, dx, -dx, -dx, dy, dy, -dy, -dy}; int ddy[8] = {-dy, dy, dy, -dy, dx, -dx, dx, -dx}; Que.push(make_pair(p1, 0)); while(!Que.empty()) { pair<pair<int, int>, int> temp = Que.front(); Que.pop(); if(temp.first.first == p2.first && temp.first.second == p2.second) return temp.second; int x = temp.first.first; int y = temp.first.second; int dis = temp.second + 1; if(Vis.count(make_pair(x, y))) continue; Vis[make_pair(x, y)] = true; for(int i = 0; i < 8; ++i) { int x1 = x + ddx[i]; int y1 = y + ddy[i]; if(valid(x1, y1, N, M)) Que.push(make_pair(make_pair(x1, y1), dis)); } } return -1; } int solve(int N, int M, int x1, int y1, int x2, int y2, int dx, int dy) { pair<int, int> p1; p1.first = x1; p1.second = y1; pair<int, int> p2; p2.first = x2; p2.second = y2; pair<int, int> p3; p3.first = N; p3.second = M; pair<int, int> p4; p4.first = dx; p4.second = dy; return bfs(p1, p2, p3, p4); } int main(){ int n; cin >> n; // your code goes here for (int i=1; i<n; i++) { for (int j=1; j<n; j++) { int moves = solve(n, n, 0, 0, n-1, n-1, i, j); cout << moves; if (j!=n-1) cout << " "; else cout << endl; } } return 0; }