搜尋剪枝DFS

2021-07-25 01:35:04 字數 1244 閱讀 4011

tempter of the bone  hdu1010

題意:給乙個圖,找出乙個看能否能在t的時間內從s到達d點;

思路:bfs肯定不行,因為bfs找到的是最短時間的路徑,無法對在t時間點到達d點進行判斷;

於是才想到了dfs,這個能把所有的情況遍歷一遍的演算法,雖然圖的長寬只有7,但是總是超時,這次終於體會到了剪枝的博大精深,因為雖然說長寬只有7,但是用dfs走圖的情況太多了,所以必須剪枝;還有標記與再標記回來;

說說這次的剪枝:

思路:剪枝+dfs

第乙個剪枝我們可以想到,當剩下的步數大於剩下的時間的時候,狗是不能走到的;

接下來我們來第二個剪枝:

我們把map的奇偶性以01編號:

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。

也就是說,如果當前的狗所在的座標與d的座標奇偶性不一樣,那麼狗需要走奇數步。

同理,如果狗所在座標與d的座標奇偶性一樣,那麼狗需要走偶數步數。

也就是說,狗的座標x、y和對2取餘是它的奇偶性,dxy和對2取余是d的奇偶性。

兩個奇偶性一加再對2取餘,拿這個餘數去與剩下時間對2取餘的餘數作比較即可

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

const int maxn = 10;

char s[maxn][maxn];

int a ,b,c,d;

int n,m,k;

struct node

;bool ans;

int derict[2] =

;bool vis[maxn][maxn];

void dfs(int x,int y ,int t)

if(ans)

return;

if(t > k)

return ;

if(abs(c - x) + abs(d - y) > k - t)

return;

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

}return;

}int main()

if(s[i][j] == 'd')}}

if(abs(a - c) + abs(b - d) > k)

{cout << "no" <

DFS搜尋 剪枝

hdu 5952 題意 給出一張無向圖,然後判斷這張圖中一共有多少個不同的大小為s的完全圖 完全圖的頂點數為s個 題目保證每個點的度不大於20。完全圖 n個點兩兩之間都有一條邊的圖叫完全圖。思路 由於頂點個數很少,而且每個點的度數最多是20,所以可以暴力優化,建圖,對於每個s點完全子圖,如果i點在子...

dfs搜尋剪枝技巧

1.當前搜到的東西劣於答案,或者當前搜到的加上之後能取到最最最優的 估價 依然劣於答案,return 2.對於第1點可以在搜前先估乙個答案上界 3.按一定順序列舉,如從小到大或從大到小,減少相同狀態 4.對第3點,在一大部分題裡從大到小枚更好,因為能更快得到乙個答案用於剪掉後面的 5.每層列舉時可判...

UVA 11882 dfs搜尋 bfs剪枝

uva 11882 dfs搜尋 bfs剪枝 給你乙個r c的數字矩陣,要求從任意乙個點開始走,只能上下左右走,求走的過數連線起來最大是多少。直接dfs每乙個數字,在每一層dfs中,加上bfs 判斷剩下的數連線起來能否大於當前的ans 不能的話 剪枝了。雖然思路是這樣的,但昨天一直tle,或許姿勢不對...