HDU1010(DFS遍歷所有情況 奇數偶數剪枝)

2021-08-29 18:47:30 字數 729 閱讀 4377

#include#include#include#include#includeusing namespace std;

const int maxn=10;

bool vis[maxn][maxn];

bool flag;

int tem;

int n,m,t,di,dj,wall,si,sj;

int step[4][2]= ,,,};

void dfs(int sx,int sy,int stepp)

tem=t-stepp-(abs(di-sx)+abs(dj-sy));

//前半部分是剩餘可用時間,後半部分是最短步數

if(tem<0||tem&1)

return;

//如果可用時間小於最短步數,或者tem為奇數

//進行剪枝

int dx,dy;

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

}return;

}int main()

vis[si][sj]=1;

dfs(si,sj,0);

if(flag)

printf("yes\n");

else

printf("no\n");

}return 0;

}

1.奇數偶數剪枝的知識點參考大佬的部落格:

2.利用深搜有利於遍歷所有情況(自己用的bfs還沒做出來)

hdu 1010 dfs,奇偶剪枝

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

DFS專攻 HDU 1010 DFS 奇偶剪枝)

這周專攻的第一道dfs終於領會了 繼續努力!剪枝的目的就是要省時 include include include include include include include include include include include define mem a,b memset a,b,siz...

DFS求解DecodeWays輸出所有情況和方法數

這是一道leetcode上的原題,在筆試面試中也經常遇到。一般我們只要求出所有的解碼種類數目就可,並沒有要求輸出所有的解碼序列,這裡運用dfs解決了這個問題。題目描述如下 現在我們先求解一下編碼方法數。通過題目我們可以知道,編碼是通過乙個或兩個字元來實現,對於乙個編碼 12125 可以乙個乙個字元的...