我必须找到从D点到R的最短路径。这些是固定点。 这是一个例子:
该框还包含墙,除非您打破它们,否则无法穿过它们。每个隔断花费你,让我们说“a”点,其中“a”是一个正整数。 每次不涉及墙的移动都要花费1分。
任务是找出最低成本的所有路径,即破墙数量最少的路径。
因为盒子的宽度可以达到100个单元格,所以使用回溯无关紧要。这太慢了。我提出的唯一解决方案就是这个:
重复步骤1,2,3,直到“乘客”到达R点。在这3个步骤之间,存在“else-if”关系。
你能想出一个更好的问题算法吗?我用C ++编程。
答案 0 :(得分:2)
使用Dijkstra,但是对于成本而言,它为1表示不会破坏墙的移动,以及(a + 0.00001)用于打破墙。然后Dijkstra将为您提供您想要的东西,即在所有最低成本路径中打破最少墙壁的路径。
从概念上讲,想象一个旅行者可以跳过墙壁 - 同时跟踪成本 - 并且当面对两条路径的选择时,也可以分成两个相同的旅行者,以便将两者都带走(拿下它们,罗伯特弗罗斯特!)。只有一位旅行者一次移动,到目前为止成本最低的旅行者。那一个移动,并写在地板上“我到达这里仅花费x”。如果我已经找到了这样的笔记,如果我更便宜地到达那里,我会删除旧笔记并写下我自己的笔记;如果那个其他旅行者以更便宜的方式到达那里我会自杀。
答案 1 :(得分:1)
两部分“先花费,然后破墙”,可以表示为一对(c,w),按字典顺序进行比较。 c是成本,w是破墙的数量。这使得它再次成为“单一的东西”(在某种意义上),所以你可以将它放入算法等等,只需要“成本”(作为一个抽象的东西,它可能会增加其他成本或比较到另一个成本)。
所以我们可以使用A*,使用曼哈顿距离启发式(也许有一些更聪明的东西不会完全忽视墙壁,但这会起作用 - 低估距离是可以接受的)。当然,运动成本不会忽视墙壁。邻居将是所有相邻的广场。所有费用都是我上面描述的那对。
答案 2 :(得分:0)
这可以很容易地建模为加权图,然后将Dijkstra's shortest path algorithm应用于它。每个方块都是一个节点。它连接到与其相邻的方块的节点。根据是否有墙,连接的重量为1或“a”。这将为您带来最低成本。最小成本和最小数量的隔断可能会有所不同。
答案 3 :(得分:0)
这是一个通用算法(您必须自己完成实施):
将矩阵转换为加权图:
Vertex
。Vertex
,创建一个Edges
数组,每个相邻Vertex
一个。Edge
,根据Vertices
所连接的Edge
之间的隔离墙成本来定义权重。然后,从Vertex D
开始,在图表上运行Dijkstra算法(http://en.wikipedia.org/wiki/Dijkstra%27s_algorithm)。作为输出,您将拥有从Vertex D
到图表上任何其他Vertex
的最短(最便宜)路径,包括Vertex R
。