#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; int n; int count (int a, int b) { vector<int> v[n]; for (int i=0; i<n; i++) { v[i].resize(n,100000); } v[0][0]=0; bool ok=false; while (!ok) { ok=true; for (int i=0; i<n; i++) for (int j=0; j<n; j++) { if (i+a<n && j+b<n && v[i+a][j+b]>v[i][j]+1) { v[i+a][j+b]=v[i][j]+1; ok=false; } if (i+a<n && j-b>=0 && v[i+a][j-b]>v[i][j]+1) { v[i+a][j-b]=v[i][j]+1; ok=false; } if (i-a>=0 && j+b<n && v[i-a][j+b]>v[i][j]+1) { v[i-a][j+b]=v[i][j]+1; ok=false; } if (i-a>=0 && j-b>=0 && v[i-a][j-b]>v[i][j]+1) { v[i-a][j-b]=v[i][j]+1; ok=false; } if (i+b<n && j+a<n && v[i+b][j+a]>v[i][j]+1) { v[i+b][j+a]=v[i][j]+1; ok=false; } if (i+b<n && j-a>=0 && v[i+b][j-a]>v[i][j]+1) { v[i+b][j-a]=v[i][j]+1; ok=false; } if (i-b>=0 && j+a<n && v[i-b][j+a]>v[i][j]+1) { v[i-b][j+a]=v[i][j]+1; ok=false; } if (i-b>=0 && j-a>=0 && v[i-b][j-a]>v[i][j]+1) { v[i-b][j-a]=v[i][j]+1; ok=false; } } } if (v[n-1][n-1]==100000) return -1; return v[n-1][n-1]; } int main(){ cin >> n; vector<int> ans[n]; for (int i=0; i<n; i++) { ans[i].resize(n); } for (int i=1; i<n; i++) for (int j=i; j<n; j++) { ans[i][j]=ans[j][i]=count(i,j); } for (int i=1; i<n; i++) { for (int j=1; j<n; j++) cout << ans[i][j] << ' '; cout << '\n'; } return 0; }