在随机生成的迷宫中使用递归回溯

本文关键字:递归 回溯 迷宫 随机 | 更新日期: 2023-09-27 18:10:20

我已经编程五年了,创建一个动态迷宫毫无困难。但是现在说到递归回溯,我完全不知道从哪里开始。我读了很多教程,主题和一些算法wiki (dijkstra的算法),它们对我来说没有意义。

我知道基本的递归是如何工作的,但我只是无法开始理解递归回溯是如何可能的,甚至没有(在我看来)存储先前搜索的路径,或者如果正在跟踪的路径突然分成两部分会发生什么。

我的程序是这样的:迷宫由484个面板组成(名为mazeTiles的面板[]数组)。有22排,每排有22个面板。黑色面板背景是墙,白色面板背景是可穿越的。

在运行时是这样的(只有当从开始的正方形(红色)到左上角的绿色正方形没有有效的路径时才会显示错误消息:

http://postimg.org/image/6c7wgxtz1/

显示的错误信息是"迷宫无法解决",即使它可以清楚地解决。此错误信息位于Button2_Click方法中。

下面是我从教程(和修改)中获得的代码,问题肯定位于方法内,但我不知道如何解决这个问题。

    private void button2_Click(object sender, EventArgs e)
    {
        int startPosition = 0;
        for (int i = 0; i < mazeTiles.Length; i++)
        {
            if (mazeTiles[i].BackColor == Color.Red)
            {
                startPosition = i;
            }
        }
        bool[] alreadySearched = new bool[484];
        if (!solveMaze(startPosition, alreadySearched))
            MessageBox.Show("Maze can not be solved.");
    }
    private bool solveMaze(int position, bool[] alreadySearched)
    {
        bool correctPath = false;
        //should the computer check this tile
        bool shouldCheck = true;
        //Check for out of boundaries
        if (position >= mazeTiles.Length || position < 0 )
            shouldCheck = false;
        else
        {
            //Check if at finish, not (0,0 and colored light blue)
            if (mazeTiles[position].BackColor == Color.Green)
            {
                correctPath = true;
                shouldCheck = false;
            }
            //Check for a wall
            if (mazeTiles[position].BackColor == Color.Black)
                shouldCheck = false;
            //Check if previously searched
            if (alreadySearched[position])
                shouldCheck = false;
        }
        //Search the Tile
        if (shouldCheck)
        {
            //mark tile as searched
            alreadySearched[position] = true;
            //Check right tile
            correctPath = correctPath || solveMaze(position + 1, alreadySearched);
            //Check down tile
            correctPath = correctPath || solveMaze(position + 22, alreadySearched);
            //check left tile
            correctPath = correctPath || solveMaze(position - 1, alreadySearched);
            //check up tile
            correctPath = correctPath || solveMaze(position - 22, alreadySearched);
        }
        //make correct path gray
        if (correctPath)
            mazeTiles[position].BackColor = Color.Gray;
        return correctPath;
    }

我需要找到并存储从红色方块到绿色方块的所有路径或最快的路径(并且只标记最快的路径)。绿色方块是静态的,而红色方块和整个迷宫是随机生成的。

在随机生成的迷宫中使用递归回溯

两年过去了,这篇文章还没有得到答复。当时我一直在寻找的答案是一个解释,让我意识到递归回溯是如何工作的。我遇到了很多麻烦,弄清楚该方法如何知道它以前在哪里,似乎没有存储访问过的区域,以防止一遍又一遍地走同样的路(无限循环)。但是当我知道它是如何工作的时候,我立刻想出了如何编写代码。

所以如果有人在想同样的事情时偶然发现了这个。理解递归回溯的一个简单方法是理解递归方法是如何工作的。递归方法不断地调用自己,直到找到正确的答案。为了找到正确的答案,递归回溯会不断调用自身内部的自身。因此,许多基本的递归方法会自我替换,因此每次通常只有一个实例,而递归回溯方法通常会堆叠在彼此的顶部。

当解决这个谜题时,方法会在自身内部不断地调用自己(类似于inception),同时不断地向一个方向前进一步,直到那个方向没有更多的步骤。那是那个实例结束的时候前一个调用它的实例继续运行。一旦这个实例结束,在它之前的实例将继续(并且它可以创建1000个自己的初始化)。

如果你仍然难以理解,想象一下你现在是如何被困在迷宫里的。你有一个超能力,它不是飞行,而是克隆。所以你一直向前走,直到路径分叉。这是当你克隆自己,让他在你的地方,而原来的你不移动,直到克隆找到出口或进入死胡同,这是克隆人传送回你,并分享他的信息。但如果你的克隆人也遇到了一条分裂的路径,他就会克隆自己,并等待他的克隆人带着迷宫的知识回来。你的克隆体的克隆体也可以产生无限数量的克隆体这取决于路径分裂的次数。最终,所有这些综合知识都会回到你的身边。这样你就知道迷宫的出口在哪里了

你的问题太宽泛了。你需要发布一个具体的问题。你好像在努力完成家庭作业。

你的问题需要调试,这需要有人来运行你的代码。你最好只是包含一个链接到你的代码,这样别人就可以运行它,如果他们想花时间这样做的话。

你可能需要一个类级属性来存储最快的路径,因为你已经返回了一个bool值,或者你可以使用一个out变量。您传递给递归方法的数组将存储我假设的所有先前检查的索引。