Another one for some late night snack. - Knight's tour! Please provide your suggestions/flaws/optimization to this knight's tour backtracking code..
package com.komal.backtracking;
import java.util.concurrent.TimeUnit;
public class KnightsTour {
static int size = 6;
static int[][] chessBoard = new int[size][size];
static int move;
static int noOfBacktrackCalls;
public boolean tourBackTrackRoutine(int row, int col) {
boolean flag = false;
noOfBacktrackCalls++;
if (!isMoveSafe(row, col)) {
return false;
}
move++;
chessBoard[row][col] = move;
if (move == size * size) {
return true;
}
flag = true;
int counter = 0;
for (int i[] : possibleMoves) {
counter++;
int newX = row + i[0];
int newY = col + i[1];
if (flag = tourBackTrackRoutine(newX, newY)) {
return true;
} else {
if (counter == possibleMoves.length) {
move--;
chessBoard[row][col] = 0;
return flag;
} else {
continue;
}
}
}
return flag;
}
public boolean isMoveSafe(int row, int col) {
if (row < 0 || col < 0 || !(row < size) || !(col < size)) {
return false;
}
if (row == size || col == size) {
return false;
}
if (chessBoard[row][col] > 0) {
return false;
} else {
return true;
}
}
int[][] possibleMoves = { { 2, 1 }, { 2, -1 }, { -2, 1 }, { -2, -1 }, { 1, 2 }, { 1, -2 }, { -1, 2 }, { -1, -2 } };
public static void main(String[] args) {
System.out.println("Solving...");
long startTime = System.nanoTime();
if (new KnightsTour().tourBackTrackRoutine(0, 0)) {
System.out.println("Solved!!");
} else {
System.out.println("Cannot be solved!!");
}
long timeTaken = TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - startTime);
System.out.println("\nCompleted in :" + timeTaken + " milli sec");
System.out.println("\nTook " + noOfBacktrackCalls + " backtrack calls for completion!");
for (int[] i : chessBoard) {
System.out.print("\n{");
for (int i1 : i) {
System.out.print(i1 + ",\t");
}
System.out.print("}");
}
}
}
Output:
Solving...
Solved!!
Completed in :382 milli sec
Took 20092518 backtrack calls for completion!
{1, 12, 21, 28, 7, 10, }
{22,29, 8, 11, 20, 27, }
{13,2, 23, 4, 9, 6, }
{30,35, 32, 17, 26, 19, }
{33,14, 3, 24, 5, 16, }
{36,31, 34, 15, 18, 25, }