這個題目用一般的搜尋無法完成,因為題目要求在指定的時間內完成,所以只好一步一步來啦,用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 第一次寫剪枝題目,用了乙個模擬地圖來做奇偶性的判定條件進行剪枝,大牛...