所以,假设我有一个迷宫,它有一个起点和终点,分别用橙色和红色标记,我的目标是找到它们之间的最小距离。被阻挡的路径用黑色表示,开放路径用白色表示。但是,这有两个修改。
代表 B =黑色,W =白色,G =灰色,R =红色,O =橙色
BBBBBB BBBBB
BBGBBB BWGGB
MAZE1 => BOWGRB MAZE2 => BOBBB
BBGBBB BWWRB
BBBBBB BBBBB
在这种情况下,ans将是
MAZE1 => M[2][1] => [2][2] => [1][2] => [2][2] => [3][2] => [2][2] => [2][3] => [2][4] = 7
MAZE2 => M[1][1] => [1][2] => [2][2] => [3][2] => [3][3] => [3][2] => [2][2] = 6
如您所见,节点多次出现
首先,我想到了使用递归技术(回溯),但无法使用算法。和
所以我想用这种方式。
我该怎么办?有什么想法吗?
答案 0 :(得分:0)
好的,也许我会尝试另一次解决这个问题。上次,我没有注意到你可以尽可能多次访问一个点,所以appoarch可能是错的。
首先,假设Start,End和Gray节点的总和为N,Start为0,End为N-1,Gray节点为1到N-2。
我们可以看到我们可以通过state
在任何时间表示(mask, index)
,其中index表示我们所在的当前节点,mask表示我们已经访问过的所有节点(0< 1>掩码< 2 ^ N)。
首先,状态是(1,0)或(00000 ... 1,0),这意味着只访问了0号城市,我们的目标是到达州(2 ^ N - 1,N - 1 )这意味着所有节点都被访问过,我们在节点N-1结束旅程。
所以,在这一点上,我们可以很容易地看到,我们将原始问题转换为状态图,我们的目标是找到从状态0(1,0)到状态结束的最短路径(2 ^ N - 1,N - 1),所以,对这个新图应用Dijkstra最短路径算法,我们得到答案。
注意:答案是基于N <= 17
的假设做出的另一个注意事项:对于机器人来说,最短路径可能不是最佳路径,因为机器人在转弯时和直线行驶时的速度是不同的。