1. 程式人生 > >DFS之奇偶性剪枝

DFS之奇偶性剪枝

奇偶剪枝

【問題描述:】

給定一個N*M的迷宮以及起點和終點,迷宮中有一些障礙無法穿過,問能否不重複也不停留地在剛好一共走T步出迷宮。

【問題分析:】

先來看下這張圖片:


也就是說當要走偶數步而規定的步數是奇數,或者要走奇數步而規定的步數是偶數,都是不可能到達的,如果要想到達,則要走的步數和規定的步數的奇偶性應該一致。又可知,奇偶性一致的兩個數的差或者和都是偶數。(下面有大用處)

例如下圖:設S點座標為(sx,sy),D點座標為(dx,dy),.表示通路,X表示障礙。

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

可知從S走到D的最短距離為abs(sx-dx)+abs(sy-dy)

S..X

..XX


.X.X
...D

上面這個迷宮中存在一些障礙,假設當前已走step步,則還剩下t-step步,設當前點到終點的最短距離為abssi - dx+ abs(sj - dy),則兩者的奇偶性一定一致的(由上面那段話可知)並且前者一定大於等於後者(剩下要走的步數大於等於該座標到終點的最短距離),只有這樣,才能夠到達。也就是tem = t – step – (abssi - dx+ abs(sj - dy))tem >= 0 && tem % 2 == 0.

下面給出一道例題: