HDU 1010 經典深搜 奇偶剪枝

2021-09-01 13:40:42 字數 1222 閱讀 4274

剛學搜尋,不知道剪枝的重要性。

超時**:

#include#include#includeusing namespace std;

char maps[10][10];

const int moves[4][2] = ,,,};

int m,n,t,di,dj;

bool escape;

void dfs(int si,int sj,int cnt)

for(int i=0;i<4;i++) }

return;

}int main()

else if(maps[i][j]=='d')

}} escape = 0;

maps[si][sj] = 'x';

dfs(si,sj,0);

if(escape) cout<<"yes"<

網上搜下,是奇偶性剪枝:

//tempter of the bone

/**//*//

奇偶剪枝:把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 需要奇數步

從 1->0 需要偶數步

那麼設所在位置 (si,sj) 與 目標位置 (di,dj)

如果abs(si-sj)+abs(di-dj)為偶數,則說明 abs(si-sj) 和 abs(di-dj)的奇偶性相同,需要走偶數步

如果abs(si-sj)+abs(di-dj)為奇數,那麼說明 abs(si-sj) 和 abs(di-dj)的奇偶性不同,需要走奇數步

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

而 (t-cnt)表示剩下還需要走的步數,由於題目要求要在 t時 恰好到達,那麼 (t-cnt) 與 abs(si-sj)+abs(di-dj) 的奇偶性必須相同

因此 temp=t-cnt-abs(sj-dj)-abs(si-di) 必然為偶數!

/*奇偶剪枝的重要思想是:如果從當前位置還需要偶數(奇數)的時間才能到達目標位置,而當前剩餘的時間數

*/ 1、temp = (t-cnt) - abs(si-di) - abs(sj-dj);

if(temp<0||temp&1) return;

2、可移動的步數大於給定的時間

起到了立竿見影的效果!

hdu1010(深搜 剪枝 回溯)

這個題目我做的時候不是超時就是錯誤,自己是新手也一直不知道再怎麼剪下去 就參考了網上一大牛blog 如下 include include include hdu1010 深搜優化剪枝 int m,n,t char map 8 8 int d 4 2 int ex,ey,sx,sy,ok void d...

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...