【问题标题】:How I Can Modify this BFS algorithm?如何修改此 BFS 算法?
【发布时间】:2021-12-05 00:25:38
【问题描述】:

所以,任务是找到迷宫中最短的路径。迷宫以布尔矩阵的形式给出,其中值“真” - 是墙,“假”显然是您可以输入的一些空间。我的输入是矩阵,并以坐标(行,列)的形式输入点。 因此,输入数据如下:

new bool[,]
{
{ true, false, true, true, false, true, true, true, true, true, true, true },
{ true, false, true, false, false, false, false, false, false, false, false, true },
{ true, false, true, true, true, true, false, true, false, true, false, true },
{ true, false, true, false, false, true, false, false, false, true, false, true },
{ true, false, true, true, false, false, false, true, true, true, false, true },
{ true, false, true, false, false, true, false, true, false, false, false, true },
{ true, false, true, true, true, true, false, false, false, true, false, true },
{ true, false, true, false, false, false, false, true, true, true, false, true },
{ true, false, false, false, true, false, false, true, false, false, false, true },
{ true, false, true, true, true, true, false, true, true, true, false, true },
{ true, false, false, false, true, false, false, true, false, true, false, true },
{ true, true, true, true, true, true, true, true, false, true, true, true }
};

从 (0, 4) 开始,我应该收到以下最短转义路径(以 ValueTuples 数组的形式):

new int[] { (11, 8), (10, 8), (10, 9), (10, 10), (9, 10), (8, 10), (7, 10), (6, 10),
 (5, 10), (5, 9), (5, 8), (6, 8), (6, 7), (6, 6), (7, 6), (7, 5),
 (7, 4), (7, 3), (8, 3), (8, 2), (8, 1), (9, 1), (10, 1), (11, 1) });

很明显,迷宫的出口可能不止一个,所以我决定使用 BFS 算法找到最短的一个。 我的代码是:

            LinkedList<(int, int)> queue = new LinkedList<(int, int)>();

            // mark start as visited
            this.maze[this.sourceVertex.Item1, this.sourceVertex.Item2] = true;

            queue.AddLast(this.sourceVertex);

            while (queue.Count != 0)
            {
                (int, int) v = queue.First.Value;
                queue.RemoveFirst();

                // find adjanced vertexes
                bool allVisited = false;
                while (!allVisited)
                {
                    int i = v.Item1;
                    int j = v.Item2;

                    if (this.borderVertices.Contains((i, j)))
                    {
                        this.exit = (i, j);
                        return;
                    }

                    // check upper cell
                    if (i >= 1 && !this.maze[i - 1, j])
                    {
                        this.maze[i - 1, j] = true;
                        queue.AddLast((i - 1, j));
                    }

                    // check bottom cell
                    if (i + 1 != this.matrixSize && !this.maze[i + 1, j])
                    {
                        this.maze[i + 1, j] = true;
                        queue.AddLast((i + 1, j));
                    }

                    // check left cell
                    if (j >= 1 && !this.maze[i, j - 1])
                    {
                        this.maze[i, j - 1] = true;
                        queue.AddLast((i, j - 1));
                    }

                    // check right cell
                    if (j + 1 != this.matrixSize && !this.maze[i, j + 1])
                    {
                        this.maze[i, j + 1] = true;
                        queue.AddLast((i, j + 1));
                    }

                    allVisited = true;
                }
            }

请注意,我不使用邻接列表,而是使用输入数据“穿越”迷宫。 borderVertices 是包含所有可能出口的列表(在矩阵的边缘之一上,并标记为假)。 问题是,我不知道如何修改我当前的代码,而不使用蛮力方法,这样我就可以得到所需形式的路径。也许一些递归方法可以成功完成这项任务,但是,我被卡住了,无法找出解决方案。我将不胜感激任何提示和建议。谢谢。

【问题讨论】:

    标签: c# breadth-first-search shortest-path path-finding maze


    【解决方案1】:

    如果遇到同样的问题,请搜索 A* 算法实现。是目前情况下最合适的算法。

    【讨论】:

      猜你喜欢
      • 2018-05-20
      • 2015-05-22
      • 2017-02-25
      • 2011-12-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-24
      • 1970-01-01
      相关资源
      最近更新 更多