簡體   English   中英

C# 停止遞歸

[英]C# Stopping recursion

所以我做了一個迷宮,其中 '#' 是牆壁和 '.' 是可移動到的坐標。 當遞歸找到迷宮外時,我試圖停止它。 所以當 (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();
            }
        }
    }

你真的應該在迷宮中放置一個“出口”節點。 在 [4][11] 我想。 然后,如果您找到出口(節點),這將是一個簡單的檢查。

你在這里遇到的是游戲板的古老問題:“我如何處理游戲場外的東西?” 和“如果我在邊境並想檢查所有相鄰的小區,我該怎么辦?”

在大多數情況下,你避免了這個問題。 你有一個牆的“邊界”。 在游戲板周圍放置不可進入的邊框是解決方案之一。 另一個將處理所有這些索引檢查。 但我個人更喜歡考慮邊界。

如果我理解你的問題,你正試圖確定當前的xy在外面的迷宮的邊界array

你可以使用Array.GetUpperBound(Int32)

獲取數組中指定維度的最后一個元素的索引。

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

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

停止遞歸只是一致地(在某種狀態下)退出方法以展開調用,即在當前xy超出邊界時使用return

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM