使用HashMap解决迷宫



我正在努力寻找解决迷宫的方法。HashMap的键是一个房间,值是可以从中访问的房间列表

Map<String, String> map ={Entrance=[R1], Room1=[R2,R4], R2=[R1,R3], R3=[R2,R4,Exit], R4=[R1,R3]}

每个Rn是一个房间。

List<String> key = map.get("Entrance");
List<String> path = new List<>();
Stack<String> visited = new Stack<>();
visited.add("Entrance");
for (String x : key){
if (!visited.contains(x))
path.add(x);
else
return path;
}

我知道我应该做一些回溯,但不知道该从这里走到哪里。我不知道如何让它返回房间列表,所以这是一条通往出口的路径。

所以你基本上拥有的是。。。

+----+----+
Entrance -> | R1 | R4 |
+----+----+
| R2 | R3 | -> Exit
+----+----+

你需要找到去R3(出口在哪里)的路

所以,我们可以看看这个问题,像这样。

我们从entrance开始

+--------------+-----------------+------+---------+
| Current Room | Available Exits | Path | History |
+--------------+-----------------+------+---------+
| Entrance     | R1              |      |         |
+--------------+-----------------+------+---------+

将当前房间添加到历史

+--------------+-----------------+------+----------+
| Current Room | Available Exits | Path | History  |
+--------------+-----------------+------+----------+
| Entrance     | R1              |      | Entrance |
+--------------+-----------------+------+----------+

它包含Exit吗?不,那我们找个房间去吧,在这种情况下,R1是我们唯一的选择,让我们去R1。将Entrance添加到我们的路径

+--------------+------------------+----------+----------+
| Current Room | Available Exits  |   Path   | History  |
+--------------+------------------+----------+----------+
| R1           | Entrance, R2, R4 | Entrance | Entrance |
+--------------+------------------+----------+----------+

它包含Exit吗?没有。好的,我们需要把我们已经去过的所有房间都搬走。这就剩下了R2R4,不管我们选择哪一个。

将当前房间添加到历史记录和路径

+--------------+------------------+-------------+-------------+
| Current Room | Available Exits  |    Path     |   History   |
+--------------+------------------+-------------+-------------+
| R1           | Entrance, R2, R4 | Entrance,R1 | Entrance,R1 |
+--------------+------------------+-------------+-------------+

让我们去R4

+--------------+-----------------+-------------+-------------+
| Current Room | Available Exits |    Path     |   History   |
+--------------+-----------------+-------------+-------------+
| R4           | R1, R3          | Entrance,R1 | Entrance,R1 |
+--------------+-----------------+-------------+-------------+

它包含Exit吗?不,我们已经是R1了,所以剩下R3了。

R4添加到我们的路径和历史

+--------------+-----------------+----------------+----------------+
| Current Room | Available Exits |      Path      |    History     |
+--------------+-----------------+----------------+----------------+
| R4           | R1, R3          | Entrance,R1,R4 | Entrance,R1,R4 |
+--------------+-----------------+----------------+----------------+

让我们去R3

+--------------+-----------------+----------------+----------------+
| Current Room | Available Exits |      Path      |    History     |
+--------------+-----------------+----------------+----------------+
| R3           | R2, R4, Exit    | Entrance,R2,R4 | Entrance,R2,R4 |
+--------------+-----------------+----------------+----------------+

它包含Exit吗?是的!!!

把它添加到我们的路径上,让我们逃跑!!

+--------------+-----------------+---------------------+---------------------+
| Current Room | Available Exits |        Path         |       History       |
+--------------+-----------------+---------------------+---------------------+
| R3           | R2, R4, Exit    | Entrance,R2,R4,Exit | Entrance,R2,R4,Exit |
+--------------+-----------------+---------------------+---------------------+

所以,你通过";迷宫";去了Entrance -> R2 -> R4 -> Exit,我们甚至不需要回溯!

现在,上面的工作流程有一个模式,看看你是否能挑出。试着每次都选择不同的房间,看看它会把你带到哪里。

从技术上讲,你不需要历史,因为你不太可能追溯,但如果迷宫变得更复杂,它就会派上用场,因为如果你追溯,你会把最后一个元素从路径上弹出,但历史会提醒你不要再走那条路;)

老实说,我认为桌面检查作为一个概念被低估了,我妻子对我很生气,因为我有几十本笔记本,里面都有不同想法的不同涂鸦,都是不相关的,所以我需要一本笔记本来记录每个单独的想法

您需要实现一个算法来查找路径。对于这类问题,有很多算法可供选择。

如果你不关心效率,那么广度优先搜索可能是最容易实现的。堆栈溢出已经有很好的例子:

用广度优先搜索寻找最短路径节点

广度优先搜索和深度优先搜索

如果你关心算法的效率(例如,你希望它能处理逐渐变大的图),你会想使用一种图算法,比如Dijkstra的最短路径。

有很多关于使用这种算法的教程,这里有一个这样的基于Java的教程。

https://www.geeksforgeeks.org/dijkstras-shortest-path-algorithm-in-java-using-priorityqueue/

最新更新