#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; void nextstep(int i, int j, int a, int b, vector<vector<int>> &s){ if(i+a<n&&j+b<n&&i+a>=0&&j+b>=0){ if(s[i+a][j+b]<=s[i][j]+1) return; else{ //cout<<999; s[i+a][j+b]=s[i][j]+1; nextstep(i+a,j+b,a,b,s); nextstep(i+a,j+b,-a,b,s); nextstep(i+a,j+b,a,-b,s); nextstep(i+a,j+b,-a,-b,s); nextstep(i+a,j+b,b,a,s); nextstep(i+a,j+b,-b,a,s); nextstep(i+a,j+b,b,-a,s); nextstep(i+a,j+b,-b,-a,s); } } /*if(i-a>=0&&j+b<=n){ if(s[i-a][j+b]<=s[i][j]+1) return; else{ s[i-a][j+b]=s[i][j]+1; } } if(i+a<=n&&j-b>=0){ if(s[i+a][j-b]<=s[i][j]+1) return; else{ s[i+a][j-b]=s[i][j]+1; } } if(i-a>=0&&j-b>=0){ if(s[i-a][j-b]<=s[i][j]+1) return; else{ s[i-a][j-b]=s[i][j]+1; } } if(i+b<=n&&j+a<=n){ if(s[i+b][j+a]<=s[i][j]+1) return; else{ s[i+b][j+a]=s[i][j]+1; } } if(i-b>=0&&j+a<=n){ if(s[i-b][j+a]<=s[i][j]+1) return; else{ s[i-b][j+a]=s[i][j]+1; } } if(i-b>=0&&j-a>=0){ if(s[i-b][j-a]<=s[i][j]+1) return; else{ s[i-b][j-a]=s[i][j]+1; } } if(i+b<=n&&j-a>=0){ if(s[i+b][j-a]<=s[i][j]+1) return; else{ s[i+b][j-a]=s[i][j]+1; } } */ return; } int nextab(int a, int b){ vector<vector<int>> s(n,vector<int>(n,n*n+1)); s[0][0]=0; nextstep(0,0,a,b,s); if (s[n-1][n-1]>n*n) return -1; else return s[n-1][n-1]; //return s[2][2]; } int main(){ cin >> n; // your code goes here for(int i=1;i<n;i++){ for(int j=1;j<n;j++){ cout<<nextab(i,j)<<" "; } cout<<"\n"; } //cout<<nextab(4,1); return 0; }