把矩陣看成如下形式:
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 但是要求時間是偶數的,都可以直接判斷不可達!
比如有一地圖:
[c-sharp]view plain
copy
s...
....
....
....
...d
要求從s點到達d點,此時,從s到d的最短距離為s = abs ( dx - sx ) + abs ( dy - sy )。
如果地圖中出現了不能經過的障礙物:
[c-sharp]view plain
copy
s..x
xx.x
...x
.***
...d
此時的最短距離s' = s + 4,為了繞開障礙,不管偏移幾個點,偏移的距離都是最短距離s加上乙個偶數距離。
就如同上面說的矩陣,要求你從0走到0,無論你怎麼繞,永遠都是最短距離(偶數步)加上某個偶數步;要求你從1走到0,永遠只能是最短距離(奇數步)加上某個偶數步。
例題:zoj problem set - 2110 tempter of the bone
題目意思是講有乙隻狗要吃骨頭,結果進入了乙個迷宮陷阱,迷宮裡每走過乙個地板費時一秒,該地板 就會在下一秒塌陷,所以你不能在該地板上逗留。迷宮裡面有乙個門,只能在特定的某一秒才能開啟,讓狗逃出去。現在題目告訴你迷宮的大小和門開啟的時間,問你狗可不可以逃出去,可以就輸出yes,否則no。
搜尋時要用到的剪枝:
1.如果當前時間即步數(step) >= t 而且還沒有找到d點,則剪掉。
2.設當前位置(x, y)到d點(dx, dy)的最短距離為s,到達當前位置(x, y)已經花費時間(步數)step,那麼,如果題目要求的時間t - step < s,則剪掉。 3.
對於當前位置(x, y),如果,(t-step-s)是奇數,則剪掉(奇偶剪枝)。
4.如果地圖中,可走的點的數目(xnum) < 要求的時間t,則剪掉(路徑剪枝)。
hdu 1010 dfs,奇偶剪枝
背景 熟悉dfs,第一次遇見了剪枝,各種剪枝。奇偶剪枝 開始一直超時,用了奇偶剪枝之後瞬間優化到312ms。對於乙個沒有障礙的圖,起點 s 到終點 的理想最短路徑是 而如果中間有障 礙物的話,路徑是在理想最短路徑上加上乙個偶數 可以證明 這樣可以看來,任何路徑和理想最短路徑是同奇偶的。這樣就可以剪去...
HDU1010 奇偶剪枝 DFS
第一次做剪枝的題目,剪枝,說實話研究的時間不短。好像沒什麼實質性的進展,遇到題目。絕對有會無從下手的感覺,剪枝越來越神奇了。hdu1010一道剪枝的經典題目,自己當初想用bfs過。提交了10幾遍wa,後來查了是剪枝最終死心了 ps 第一次寫剪枝題目,用了乙個模擬地圖來做奇偶性的判定條件進行剪枝,大牛...
HDU1010 奇偶剪枝 dfs)
the doggie found a bone in an ancient maze,which fascinated him a lot.however,when he picked it up,the maze began to shake,and the doggie could feel t...