import java.io.*; import java.util.*; import java.text.*; import java.math.*; import java.util.regex.*; public class Solution { public static void main(String[] args) { Scanner in = new Scanner(System.in); int n = in.nextInt(); // your code goes here int[][] total_moves=new int[n][n]; int[][] movement=new int[n][n]; for(int i=1;i q=new LinkedList(); HashMap visited=new HashMap(); q.add("00"); // int count=0; while( !q.isEmpty()) { String xx=q.remove(); x=Integer.parseInt(xx.substring(0,1)); y=Integer.parseInt(xx.substring(1,2)); // System.out.println(" queue gives ("+x+","+y+")"+q.size()); if(x==n-1 && y==n-1){ total_moves[a][b]=movement[n-1][n-1]; total_moves[b][a]=total_moves[a][b]; // System.out.println("for "+a+","+b+": "+movement[n-1][n-1]); break; } if(!visited.containsKey(xx)){ // System.out.println("("+x+","+y+")"); visited.put(xx,true); if ((x+a < n) && (y+b < n)){ if(( movement[x+a][y+b] > movement[x][y]+1) ) { movement[x+a][y+b]=movement[x][y]+1; String xy= String.valueOf(x+a).concat(String.valueOf(y+b)) ; q.add(xy); xx =q.peek(); // System.out.println(" queue contains ("+xx.substring(0,1)+","+xx.substring(1,2)+")"+q.size()); } if ((y+a < n) && (x+b < n)) { movement[x+b][y+a]=movement[x][y]+1; String xy= String.valueOf(x+b).concat(String.valueOf(y+a)) ; q.add(xy); // System.out.println(" for"+xy); xy=q.peek(); // System.out.println(" queue contains ("+xy.substring(0,1)+","+xy.substring(1,2)+")"+q.size()); //System.out.println(" queue contains ("+xy[0]+","+xy[1]+")"+q.size()); } // System.out.println(movement[x+a][y+b]+"-------------"); } else if (((y+a < n) && (x+b < n)) && movement[x+b][y+a] > movement[x][y]+1){ movement[x+b][y+a]=movement[x][y]+1; String xy= String.valueOf(x+b).concat(String.valueOf(y+a)) ; q.add(xy); } if ((x-a >= 0) && (y-b >= 0)){ if( movement[x-a][y-b] > movement[x][y]+1 ){ movement[x-a][y-b]=movement[x][y]+1; String xy= String.valueOf(x-a).concat(String.valueOf(y-b)) ; q.add(xy); } if ((y-a >= 0) && (x-b >=0)) { movement[x-b][y-a]=movement[x][y]+1 ; String xy= String.valueOf(x-b).concat(String.valueOf(y-a)) ; q.add(xy); } } else if (((y-a >= 0) && (x-b >=0)) && movement[x-b][y-a] > movement[x][y]+1){ movement[x-b][y-a]=movement[x][y]+1 ; String xy= String.valueOf(x-b).concat(String.valueOf(y-a)) ; q.add(xy); } if ((y+b < n) && (x-a >= 0)) { if(movement[x-a][y+b] > movement[x][y]+1){ movement[x-a][y+b]=movement[x][y]+1; String xy= String.valueOf(x-a).concat(String.valueOf(y+b)) ; q.add(xy); } if ((y-a >= 0) && (x+b < n)) { movement[x+b][y-a]=movement[x-a][y+b]; String xy= String.valueOf(x+b).concat(String.valueOf(y-a)) ; q.add(xy); } } else if (((y-a >= 0) && (x+b < n)) && movement[x+b][y-a] > movement[x][y]+1){ movement[x+b][y-a]=movement[x][y]+1; String xy= String.valueOf(x+b).concat(String.valueOf(y-a)) ; q.add(xy); } if ((x+a < n) && (y-b >=0)) { if(movement[x+a][y-b] > movement[x][y]+1 ){ movement[x+a][y-b]=movement[x][y]+1; String xy= String.valueOf(x+a).concat(String.valueOf(y-b)) ; q.add(xy); } if ((x-b >=0) && (y+a < n)){ movement[x-b][y+a]=movement[x+a][y-b]; String xy= String.valueOf(x-b).concat(String.valueOf(y+a)) ; q.add(xy); } } else if (((x-b >=0) && (y+a < n)) && movement[x-b][y+a] > movement[x][y]+1){ movement[x-b][y+a]=movement[x][y]+1; String xy= String.valueOf(x-b).concat(String.valueOf(y+a)) ; q.add(xy); } } } if(total_moves[a][b]==0){ total_moves[a][b]=-1; total_moves[b][a]=-1; // System.out.println("for "+a+","+b); } } System.out.print(total_moves[a][b]+" "); } System.out.println(); } } }