C# Остановка рекурсии - PullRequest
       6

C# Остановка рекурсии

0 голосов
/ 01 февраля 2020

Итак, я создал лабиринт, где «#» - стены, а «.» доступны координаты для перемещения. Я пытаюсь остановить рекурсию, когда она выходит из лабиринта. Поэтому, когда (x, y) равно 12. Это может быть простое исправление.

Это мой лабиринт ...

char[,] maze1 =
            // USE THIS
        { { '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#' },
        { '#', '.', '.', '.', '#', '.', '.', '.', '.', '.', '.', '#' },
        { '#', '.', '#', '.', '#', '.', '#', '#', '#', '#', '.', '#' },
        { '#', '#', '#', '.', '#', '.', '.', '.', '.', '#', '.', '#' },
        { '#', '.', '.', '.', '.', '#', '#', '#', '.', '#', '.', '.' },
        { '#', '#', '#', '#', '.', '#', '.', '#', '.', '#', '.', '#' },
        { '#', '.', '.', '#', '.', '#', '.', '#', '.', '#', '.', '#' },
        { '#', '#', '.', '#', '.', '#', '.', '#', '.', '#', '.', '#' },
        { '#', '.', '.', '.', '.', '.', '.', '.', '.', '#', '.', '#' },
        { '#', '#', '#', '#', '#', '#', '.', '#', '#', '#', '.', '#' },
        { '#', '.', '.', '.', '.', '.', '.', '#', '.', '.', '.', '#' },
        { '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#' } };

Вот мой метод ...

private void mazeTraversal(int currentX, int currentY, char[,] maze)
    {
        /*************** ATTEMPT 1 ******************/

        // Checks if coordinates are inside the maze
        if (currentX <= 11 && currentY <= 11)
        {
            // Implement maze traversal recursive call
            //PrintOriginalMaze(maze, currentX, currentY);

            // If the coordinate is a '.' , continue(This is the base case)
            if ('.' == maze[currentX, currentY])
            {
                // Changes location to a X so you cant go back.
                maze[currentX, currentY] = 'X';

                // Implement maze traversal recursive call
                PrintOriginalMaze(maze, currentX, currentY);

                mazeTraversal(currentX, currentY + 1, maze);
                // maze[currentX, currentY] = 'X';

                mazeTraversal(currentX - 1, currentY, maze);
                //maze[currentX, currentY] = 'X';

                mazeTraversal(currentX + 1, currentY, maze);
                // maze[currentX, currentY] = 'X';

                mazeTraversal(currentX, currentY - 1, maze);
                //maze[currentX, currentY] = 'X';

            }

            if ('#' == maze[currentX, currentY])
            {
                Console.WriteLine("Hit a wall");
                Console.WriteLine();
            }
        }
    }

Ответы [ 2 ]

0 голосов
/ 01 февраля 2020

Если я понимаю ваш вопрос, и вы пытаетесь определить, находятся ли текущие x и y за пределами границ вашего лабиринта (array)

Вы может использовать Array.GetUpperBound(Int32)

Получает индекс последнего элемента указанного измерения в массиве.

var maxX = maze1.GetUpperBound(0);
var maxY = maze1.GetUpperBound(1);

if (currentX > maxX || currentX < 0 || currentY > maxY || currentY < 0)
  return;

Остановка рекурсия - это просто вопрос последовательного выхода из метода (в некотором состоянии) для распаковки вызова, то есть использования return, когда ваш текущий xy находится за пределами границ .

0 голосов
/ 01 февраля 2020

Вы действительно должны поместить «выходной» узел в лабиринт. На [4] [11] я думаю. Тогда было бы простой проверкой, нашли ли вы выход (узел).

Здесь у вас есть извечная проблема с игровыми досками: «Как я справляюсь с вещами только за пределами игрового поля?» и «Что мне делать, если я нахожусь на границе и хочу проверить все соседние ячейки?»

По большей части вы избежали этой проблемы. У вас есть «граница» стен. Помещение не входящей границы вокруг игрового поля - одно из решений. Другой будет иметь дело со всеми этими проверками индекса. Но лично я предпочитаю учесть границы.

...