예제 #1
0
        /*
         * 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);
                }
            }
        }
예제 #2
0
        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);
        }