1. 程式人生 > >Search中的剪枝-奇偶剪枝

Search中的剪枝-奇偶剪枝

設有一矩陣如下:
0 1 0 1 0 1
1 0 1 0 1 0
0 1 0 1 0 1
1 0 1 0 1 0
0 1 0 1 0 1
從為 0 的格子走一步,必然走向為 1 的格子 。//只能走四個方向
從為 1 的格子走一步,必然走向為 0 的格子 。
即:
從 0 走向 1 必然是奇數步,從 0 走向 0 必然是偶數步。

所以當遇到從 0 走向 0 但是要求時間是奇數的或者 從 1 走向 0 但是要求時間是偶數的,都可以直接判斷不可達!

比如有一地圖:

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

要求從S點到達D點,此時,從S到D的最短距離為s = abs ( dx - sx ) + abs ( dy - sy )。

這裡插入:abs()與babs()的區別

  abs()主要是用來求整數的絕對值,在 <stdlib.h >或  <cstdlib> 中;

  babs()主要是用來精度要求更高的 float , double 的絕對值,在 <cmath> 中,

  C++可以在 <cmath> 中都可以呼叫。

如果地圖中出現了不能經過的障礙物:

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

此時的最短距離s' = s + 4,為了繞開障礙,不管偏移幾個點,偏移的距離都是最短距離s加上一個偶數距離。

就如同上面說的矩陣,要求你從0走到0,無論你怎麼繞,永遠都是最短距離(偶數步)加上某個偶數步;要求你從1走到0,永遠只能是最短距離(奇數步)加上某個偶數步。

例題:ZOJ Problem Set - 2110 Tempter of the Bone