Crazy Robot

发布时间 2023-11-09 09:43:45作者: Zlc晨鑫

貌似没有严格证明的啊。

现在证明一件事,如果一个点是可以走到L的,那么路径上的.没有岔路。

假设有岔路,我们找到从起点开始的第一个岔路,取出其中的这一部分,然后旋转成这种形状。

...
 .

因为它是一定要到终点去的(从1来,要到3去),所以必然从1到2,到了2之后。

  • 如果你要求它向左走,或者向右、向上走,它都可以向下走到4。

  • 走到4之后,要么你一直命令它向上、右、左走,它就原地不动,到不了终点;要么你就命令它向下走,它就会回到2。

于是开始了循环……

但是如果你要求它向下走,它就会向左走或者向右走,它可以选择向左走,然后回到了1。

然后开始了循环(回到了1,一开始就是从1来的)……

在这之后,你要么一直使它(不是命令)往反方向走,此时机器人一定到不了终点;要么使它走到2之后,机器人总是有方法,让自己的位置始终走不到3,也一定到不了终点(存在一种方式到不了就不算)。

这与路径是可达L的矛盾,所以路一定是直的,即不存在分叉,但是拐弯并不算分叉。

而且,一条没有分叉的路,一定可以一直命令它往回走,它就只能一直往前走,然后走到L

所以这是等价的。

在图中,这些路径长这样(重合的合并为一条极长的路径):

为了方便,我们不如从终点开始搜,没有分叉相当于除了来的点,只有一个可达的.

这就是大部分题解搜索的依据。

注意,可能有这样的路径:

.#
..
L.

L出发,可以往上走,往右走(即有两种以上方式可以走到一条路径上),会不会对搜索的正确性产生影响呢?

我们发现是不会的,因为如果先考虑向上走,会发现这个点可达两个没走过的.,不会入队,只会从右边的起点走过这条路径。

其实路径只能从一端开始拓展,因为中间任何一个点都有两个邻居,会使得从中间点开始拓展是非法的,故不用有上述担忧。