HDOJ 1010 DFS 迷宮 (奇偶剪枝)

2022-05-06 07:57:09 字數 1726 閱讀 6112

這個題目用一般的搜尋無法完成,因為題目要求在指定的時間內完成,所以只好一步一步來啦,用dfs解決

但是如果這樣結果會超時,網上說是用一種奇偶剪枝的方法來間斷搜尋時間,下面是剪枝的簡單理論,一看就懂:

把map看作

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 需要奇數步

從 0->0 需要偶數步

那麼設所在位置 (x,y) 與 目標位置 (dx,dy)

如果abs(x-y)+abs(dx-dy)為偶數,則說明 abs(x-y) 和 abs(dx-dy)的奇偶性相同,需要走偶數步

如果abs(x-y)+abs(dx-dy)為奇數,那麼說明 abs(x-y) 和 abs(dx-dy)的奇偶性不同,需要走奇數步

理解為 abs(si-sj)+abs(di-dj) 的奇偶性就確定了所需要的步數的奇偶性!!

而 (ti-setp)表示剩下還需要走的步數,由於題目要求要在 ti時 恰好到達,那麼  (ti-step) 與 abs(x-y)+abs(dx-dy) 的奇偶性必須相同

因此 temp=ti-step-abs(dx-x)-abs(dy-y) 必然為偶數!

view code

/*

功能function description: poj-1010

開發環境environment: vc6.0

技術特點technique:

版本version:

作者author: jzjz

日期date: 20120817

備註notes: 迷宮搜尋+奇偶剪枝 */

#include

#include

inttime,atx,aty,n,m;

char map[26][26

];bool

flag;

void dfs(int x,int y,int

t)

int temp=t-abs(x-atx)-abs(y-aty); //

剪枝 if(temp<0 || temp&1)//

奇偶性剪枝 與運算 判斷奇偶,偶時才行

return

; map[x][y]='x'

;

if(map[x+1][y]!='x'

)

if(map[x][y+1]!='x'

)

if(map[x-1][y]!='x'

)

if(map[x][y-1]!='x'

)

map[x][y]='.'

;}intmain()

if(map[i][j]=='d'

)

if(map[i][j]=='x'

) wall++;}}

dfs(x,y,time);

if(n*m-wall<=time)

if(flag)

printf(

"yes\n");

else

printf(

"no\n");

}return0;

}

HDOJ 1010迷宮 dfs 奇偶剪枝

奇偶剪枝 把矩陣標記成如下形式 0,1,0,1,0 1,0,1,0,1 0,1,0,1,0 1,0,1,0,1 很明顯,如果起點在0 而終點在1 那顯然 要經過奇數步才能從起點走到終點,依次類推,奇偶相同的偶數步,奇偶不同的奇數步。在讀入資料的時候就可以判斷,並且做剪枝,當然做的時候並不要求把整個矩...

hdu 1010 dfs,奇偶剪枝

背景 熟悉dfs,第一次遇見了剪枝,各種剪枝。奇偶剪枝 開始一直超時,用了奇偶剪枝之後瞬間優化到312ms。對於乙個沒有障礙的圖,起點 s 到終點 的理想最短路徑是 而如果中間有障 礙物的話,路徑是在理想最短路徑上加上乙個偶數 可以證明 這樣可以看來,任何路徑和理想最短路徑是同奇偶的。這樣就可以剪去...

HDU1010 奇偶剪枝 DFS

第一次做剪枝的題目,剪枝,說實話研究的時間不短。好像沒什麼實質性的進展,遇到題目。絕對有會無從下手的感覺,剪枝越來越神奇了。hdu1010一道剪枝的經典題目,自己當初想用bfs過。提交了10幾遍wa,後來查了是剪枝最終死心了 ps 第一次寫剪枝題目,用了乙個模擬地圖來做奇偶性的判定條件進行剪枝,大牛...