如何解决给定的2D迷宫



我是Python的初学者,所以我还有很多东西要学。这是我在竞争性编程过程中遇到的一个问题,即使在这之后,我仍然找不到合适的方法来解决它。有人能指导我如何解决这类问题吗?

Mary Jane的牛奶用完了!她让蜘蛛侠去买一些,但是有人把这个地区所有商店的牛奶都偷走了,所以你需要找到蜘蛛侠能否及时拿到城里最后的牛奶来做晚饭。

输入格式

第一行将包含单个整数n,表示后面的数据集的数量。每个数据集将以3个整数r, c和s开始。接下来的r行将由c个字符组成,表示蜘蛛侠必须穿越的城市布局来获得牛奶,下面的字符有以下会议。

S – denotes the location of Spider-Man in the city.
# - denotes the location of a building in the city, it takes 3 seconds to traverse one of these.
. – denotes an open street, it takes 1 second to traverse one of these.
Y, U, L, R, E – denotes the location of minor villains (Mysterio, Vulture, Lizard, Rhino, Electro) in the city, if you travel through one of these it takes 5 seconds to defeat them before you can move on.
D, V, C – denotes the location of major villains (Doctor Octopus, Venom, Carnage) in the city, and it takes 8 seconds to defeat them before you can move on.
M – denotes the location of the milk in the city, this is the end point of the maze.

注意:并不总是有一条保证的路径到牛奶。纽约可能没有牛奶,在这种情况下,这是一个自动失败。蜘蛛侠只能上下左右移动,没有对角线。

输出格式

如果蜘蛛侠在不到5秒的时间内拿到牛奶,输出"Everything's peach, spider - ty escaped in",后面跟着蜘蛛侠逃走的步数,后面跟着";"秒!"。否则,输出"蜘蛛侠有婚姻问题"。

样本输入0

2
5 6 9
S..#..
##..R#
.#.#.#
#M..#.
#..#.#
7 7 5
#..#S.#
#Y..L.#
..#.U.V
O.#..#M
..#..DY
#......
.#.#.C.

样本输出0

Everything's peachy, Spidey escaped in 6 seconds.
Spidey's having marital problems.

这是一个具有双有向边的网格图上的标准最短路径问题。节点是网格元素。"in"每个顶点的边在边的头部得到相应的网格正方形类型的代价。然后使用像Dijkstra这样的标准最短路径算法来找到从蜘蛛的位置到每个牛奶位置的所有最短距离。最后,取其中最小的

你实际上不需要构造一个图。只需使用字符串表示并实现Dijkstra's来动态地推断边缘及其成本。

嗯,反派/建筑障碍带来了一个有趣的转折。

没有它们,一个简单的洪水填满至少会让你回答布尔问题吗"有牛奶吗?">


有了他们,这开始看起来很像一个加权(无向)图。

所以像这个例子中的映射

AB
CD

是一个有边的四节点图

  • A - B
  • a - c
  • b - d
  • c - d

为单位权重,然后是网络能很快地画出这样一张图,直接给出蜘蛛侠的路径。

每个障碍都会增加重量两条边、三条边或四条边。

没有明确说明,但显然有单位成本进入Milk位置


哥谭是个大城市。

上述方法的一个缺点是它忽略了阈值参数s。也就是说,如果路径存在,它查找路径,即使路径是无用的因为它超过了阈值。这可能会占用一些CPU时间。

换句话说,对于非常大的图,我们想早点结束如果我们能证明没有"足够短"路径。

考虑进行洪水填充,你在哪里用最低成本标记每个地点要到达那里。当所有这些成本超过s时,尽早退出以报告失败。这将有助于缩放到非常大的地图。

最新更新