搜索技巧——奇偶剪纸

一、

关于奇偶剪枝

1、

首先举个例子,有如下4*4的迷宫,'.'为可走路段,'X'为障碍不可通过

S...
....
....
...D

从S到D的最短距离为两点横坐标差的绝对值+两点纵坐标差的绝对值 = abs(Sx - Dx) + abs(Sy - Dy) = 6,这个应该是显而易见的。

遇到有障碍的时候呢

S.XX
X.XX
...X
...D

你会发现不管你怎么绕路,最后从S到达D的距离都是最短距离 + 一个偶数,这个是可以证明的

而我们知道:

奇数 + 偶数 = 奇数
偶数 + 偶数 = 偶数

因此不管有多少障碍,不管绕多少路,只要能到达目的地,走过的距离必然是跟最短距离的奇偶性是一致的。

所以如果我们知道从S到D的最短距离为奇数,那么当且仅当给定的步数T为奇数时,才有可能走到

如果给定的T的奇偶性与最短距离的奇偶性不一致,那么我们就可以直接判定这条路线永远不可达了


2、引图举例

(1)、

现假设起点为(sx,sy),终点为(ex,ey),给定   t  步恰好走到终点,

s

    

|

    

|

    

|

    

+

e

如图所示(“|”竖走,“—”横走,“+”转弯),易证   abs(ex-sx)+abs(ey-sy)  为此问题类中任意情况下,起点到终点的最短步数,记做step,此处step1=8;

s

 
 

+

 

|

+

   

|

    

+

e

如图,为一般情况下非最短路径的任意走法举例,step2=14;

step2-step1=6,偏移路径为6,偶数(易证);

结论

推广之,若   t-  [abs(ex-sx)+abs(ey-sy)]   结果为非偶数(奇数),则无法在 t 步恰好到达;返回,false;

反之亦反。


(2)、

还是以这个为例子吧,现在我把矩阵填满 0 和 1 [1] 

0

1

0

1

0
1

0

1

0

1

0

1

010

1

0101

0

1

0

1

0

我们现假设从 0 开始走,则不难证明,

从任意 0 走到任意 1 始终是奇数步;

从任意 0 走到任意 0 始终是偶数步;

引用描述里的“例子”, s 到 e 的最短步数为 t (当然你也可以理解成此时到终点刚好剩余 t 步等等)。

则,我们从 s 到 e 的步数之和(或者说总距离)总可以表示成    sum= t + extra ( extra>=0 ),其中 extra 表示额外的步数。

如:

s

 
 

+

 

|

+

   

|

    

+

e

此时 t=8,sum=14,所以我们容易得到 extra=6。也就是说按照这个走法,需要在最短的步数上再走额外的 6 步(先不用太在意这些偏移是在什么地方产生的)。

又如:

s

 
 

+

 

|

+

   

|

 +e

+

  

此时,t=7,sum=15,所以我们也容易得到 extra=8。


(3)、

根据理科生的天性,由这两个一般性的例子,我们很容易嗅察到 extra 都为偶数。先带着疑惑,

再来看我给的 0 、1 矩阵。

0

1

0

1

0
1

0

1

0

1

0

1

010

1

0101

0

1

0

1

0

设左上角坐标为(1,1),右下角坐标为(5,5).

那么我们给的例1,

起点 s 的坐标为(1,1),此点为“0”;

终点 e 为(5,5),此点为“0”。

所以    t=8,为偶数。

现在我们再倒过来看,从终点(也就是 e )出发,把最短步数 t=8 耗费掉,不妨这样走,

s

   +
   

+

   | 
  + 
  

e

如图所示从 e (5,5)耗费 8 步走到了(1,5)点。

因为是从 0 走偶数步,所以走到的坐标也一定是 0 ,就像这里的(1,5)点是 0 一样。

这是一个递归的过程,首先如果从0开始,目的地也是0,那么其中的最短距离 t 必然是个偶数,可其中有可能有障碍物或需要绕弯的情况,那么我们就现将最短距离 t 用于绕弯,从开始的0,走t步不管怎么走都只能到0,而这个0到终点0的最短路径t也必然是偶数,一直递归下去,直到你绕够了到达终点,这中间你额外的步数都是偶数。

注意到,(1,5)点和起点 s (1,1)都是 0,也就是说,这个 extra 必然是偶数!

再看例2,同样从终点 e 开始耗费 t=7 步,

则所到的点一定是 0 (不管它在哪里),再从这个点回到起点 s ,所用的 extra 也必然是个偶数!

所以无论如何,sum= t + extra ( extra>=0 ) 中的 extra 都是一个偶数

那么我们就可以用公式 t-[abs(ex-sx)+abs(ey-sy)] 计算出extra是否为偶数来判断当前点能否恰好在这么多步到达终点了。

以上来自百度百科

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值