我认为你可以通过首先找到所有可以通过 0 个右转到达的点来做到这一点。然后只需右转 1 次,以此类推。您可以使用队列来执行此操作。请注意,在第 n 阶段,您已经获得了 n 右转可以到达的所有点的最佳解决方案。更重要的是 - 任何尚未到达的点都可以通过 > n 点到达或根本无法到达。为了达到最佳时间复杂度,您必须使用这样一个事实,即您只需要从那些到达点中搜索新的可到达点,这些点在适当的方向上有一个未到达的邻居。由于每个点只有 4 个邻居,因此您只能从中搜索 4 次。您可以通过为每个方向 D 维护一个单独的列表来实现它,该列表包含所有到达的点以及该方向上未到达的邻居。
下面我给出一个图形示例:
. . . . . . (0) . . . . . 0 1 1 1 1 (1) 0 1 1 1 1 1
. ####### . . 0 ########## . 0 ########## . 0 ########## 2
. # . # . . 0 # . # . . 0 # . # . . 0 # . # . (2)
. # . . . . 0 # . . . . 0 # . . . . 0 # . . . (2)
. #### . # . 0 #### . # . 0 #### . # . 0 #### . # 2
(.) . . . . . (0) . . . . . 0 1 1 1 1 1 0 1 1 1 1 1
0 1 1 1 1 1 0 1 1 1 1 1
0 ########## 2 0 ########## 2
0 # . # 3 2 0 # 4 # 3 2
0 # (3) 3 3 2 0 # 3 3 3 2
0 #### . # 2 0 #### 4 # 2
0 1 1 (1) 1 1 0 1 1 1 1 1
( )
表示到达的点与相应的邻居未到达