剛學搜尋,不知道剪枝的重要性。
超時**:
#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...