我正在努力寻找解决迷宫的方法。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
吗?没有。好的,我们需要把我们已经去过的所有房间都搬走。这就剩下了R2
和R4
,不管我们选择哪一个。
将当前房间添加到历史记录和路径
+--------------+------------------+-------------+-------------+
| 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/