通过开始和结束之间的最小距离必须访问迷宫中的点

时间:2014-08-22 06:43:41

标签: algorithm shortest-path path-finding maze traveling-salesman

所以,假设我有一个迷宫,它有一个起点和终点,分别用橙色和红色标记,我的目标是找到它们之间的最小距离。被阻挡的路径用黑色表示,开放路径用白色表示。但是,这有两个修改。

  1. 有些细胞必须参观,标有灰色。
  2. 任何单元格都可以被访问过很多次(即使是开始,结束也必须访问点)
  3. 代表     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
    

    如您所见,节点多次出现

    首先,我想到了使用递归技术(回溯),但无法使用算法。和

    所以我想用这种方式。

    1. 我将跟踪必须访问点,起点和终点的所有坐标
    2. 找出每个节点之间的距离(就像选择排序一样,我们比较每个术语,就像那样,我们得到每个节点之间的最小距离(使用BFS))
    3. 然后应用一些最小距离算法。我想到了TSP,但它说节点必须只访问一次。这可能是多次。我发现了中国邮递员的问题,但不知道是否可以在这里申请。 Floyd warshall算法存在,但它不包括每一点
    4. 我该怎么办?有什么想法吗?

1 个答案:

答案 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

的假设做出的

另一个注意事项:对于机器人来说,最短路径可能不是最佳路径,因为机器人在转弯时和直线行驶时的速度是不同的。