/* * Go over each row from 0 to n - 1, * for each row, go over column from 0 to n - 1 * */ public void CalculateChessBoardMinimumSteps() { for (int rowIncrement = 1; rowIncrement < Size; rowIncrement++) { for (int colIncrement = 1; colIncrement < Size; colIncrement++) { KnightL knightL = new KnightL(rowIncrement, colIncrement, Size); Step[rowIncrement - 1][colIncrement - 1] = KnightL.CalculateStepsFromLeftTopToBottomRight(knightL); } } }
public static int CalculateStepsFromLeftTopToBottomRight( KnightL knightL) { int n = knightL.chessBoardSize; int dx = knightL.nSquaresHorizontal; int dy = knightL.mSquaresVertically; bool[] visited = new bool[n * n]; int steps = 0; var queue = new Queue <int>(); visited[0] = true; queue.Enqueue(0); while (queue.Count > 0) { int count = queue.Count; for (int i = 0; i < count; i++) { int position = queue.Dequeue(); int row = (position / n); int col = (position % n); if (row == n - 1 && col == n - 1) { // Found solution. return(steps); } Visit(row + dx, col + dy, n, queue, visited); Visit(row + dx, col - dy, n, queue, visited); Visit(row + dy, col + dx, n, queue, visited); Visit(row + dy, col - dx, n, queue, visited); Visit(row - dx, col + dy, n, queue, visited); Visit(row - dx, col - dy, n, queue, visited); Visit(row - dy, col + dx, n, queue, visited); Visit(row - dy, col - dx, n, queue, visited); } steps++; } return(-1); }