【发布时间】: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