object Solution { def main(args: Array[String]) { val sc = new java.util.Scanner (System.in); var n = sc.nextInt(); time{ allCombinations(n) } } def allCombinations(n:Int) = { var board = Array.ofDim[Boolean](n,n) for(i <- 1 until n){ for(j <- 1 until n){ board = Array.ofDim[Boolean](n,n) val res = findMinMoves(board, n, i, j, 0, 0, 0) if(res == 1000000) print("-1 ") else print(res+" ") } print("\n") } } def findMinMoves(board:Array[Array[Boolean]], n:Int, i:Int, j:Int, x:Int, y:Int, nbMovesSoFar:Int):Int = { // Don't get out of the board if(x<0 || y<0 || x>n-1 || y > n-1){ //println("Sorti de la zone : "+x+" "+y) return 1000000 } // Skip the tiles already visited if(board(x)(y) == true) return 1000000 if(x == n-1 && y == n-1){ //println("Arrivée") return nbMovesSoFar } board(x)(y) = true //println("Possibilité : "+x+" "+y) return min(findMinMoves(board, n, i, j, x+i, y+j, nbMovesSoFar+1), findMinMoves(board, n, i, j, x-i, y+j,nbMovesSoFar+1), findMinMoves(board, n, i, j, x+i, y-j,nbMovesSoFar+1), findMinMoves(board, n, i, j, x-i, y-j,nbMovesSoFar+1), findMinMoves(board, n, i, j, x+j, y+i,nbMovesSoFar+1), findMinMoves(board, n, i, j, x-j, y+i,nbMovesSoFar+1), findMinMoves(board, n, i, j, x+j, y-i,nbMovesSoFar+1), findMinMoves(board, n, i, j, x-j, y-i,nbMovesSoFar+1) ) } def min(a:Int, b:Int, c:Int, d:Int, e:Int, f:Int, g:Int, h:Int):Int = { var min = a min = if(b R): R = { val t0 = System.nanoTime() val result = block // call-by-name val t1 = System.nanoTime() System.err.println("Elapsed time: " + (t1 - t0) + "ns") result } }