專題訓練之BFS DFS 二分

2021-10-20 11:00:21 字數 2118 閱讀 8065

bsf是指寬度優先搜尋。從我的理解來說,就是從乙個節點出發,一步步地走從該節點出發,實現所有的可能性。

在以前學資訊學競賽的時候,我們老師曾這麼這麼解釋:bfs就是從乙個點出發,一直走到底,豎著一列列搜尋;dfs就是從乙個點出發,走所有可能的地方,橫著一層層搜尋。

搜尋完當前點,回溯的時候,要注意還原原來的狀態。例如在取書問題中,我們可以用乙個陣列標記哪些書已經取過,在回溯的時候,記得要將該書重新標記回未取過。

基本模板:

int

check

(引數)

void

dfs(

int step)

嘗試每一種可能

}

二分最經典的案例,便是猜數遊戲,每次猜當前範圍的中值,是猜到目標值的最優方法。二分思想便是設定邊界,將中值與目標想相比較;然後轉換邊界,以中值為界限,轉換為左邊界或右邊界。

下面這個是乙個師兄推薦的,也是我最喜歡的乙個模板

int l = 下界 -

1 r = 上界 +

1while

(l+1

//l 為滿足 c(x) 的最大值, r為不滿足c(x)的最小值

題目鏈結

題意:給出n*m方格,求有多少個被「.」包圍的「w」區域

思路:經典dfs題,搜尋一下。

#include

#include

using

namespace std;

string s[

110]

;int a[8]

[2]=

,,,,

,,,}

;int n,m;

bool

check

(int x,

int y)

void

dfs(

int x,

int y)

return;}

else

return;}

intmain()

for(i=

0; i)for

(j=0

; jcout

}

題目鏈結

題意:給出n*m方格,求從「@」出發,不碰及「#」邊界,可以走到的「.」有多少個?

思路:與上題相似,先找到「@」點,從該點出發深搜。

#include

int n,m,ans;

using

namespace std;

char s[30]

[30];

int ss[30]

[30];

int a[4]

[2]=

,,,}

;bool

check

(int x,

int y)

void

dfs(

int x,

int y)

}else

return;}

intmain()

}}dfs(x,y)

; cout<}return0;

}

題意:實際為01揹包

思路:可以用dp,這裡鍛鍊一下dfs。dfs過程中記錄一下所用石子數量,所用石子價值,所用石子重量,再判斷一下結束邊界即可。

#include

#include

using

namespace std;

struct shi

shi[

110]

;int n,ans,k,wmax;

int v[

110]

;void

dfs(

int x,

int w,

int y,

int dex)

else

if(w}int

main()

return0;

}

leetcode專題訓練 二分搜尋

1 35.搜尋插入位置 給定乙個排序陣列和乙個目標值,在陣列中找到目標值,並返回其索引。如果目標值不存在於陣列中,返回它將會被按順序插入的位置。你可以假設陣列中無重複元素。2 74.搜尋二維矩陣 編寫乙個高效的演算法來判斷 m x n 矩陣中,是否存在乙個目標值。該矩陣具有如下特性 每行中的整數從左...

二分專題題解

題目大意為給一條直線上的n個點,讓你隨意選取c個點,然後使得這c個點兩兩之間的最小距離最大,如何選取這c個點使這個最小距離最大,輸出最大的最小距離max。先把座標排序,之後界定二分的範圍,二分的縮小範圍的條件則為當兩點距離大於所輸入的點時,s 返回s。如若s大於所處的點,說明值太小,將左界變為mid...

整體二分專題

何謂整體二分?一般的二分只適用於單個詢問的,如果有很多個詢問,就變成了n 2n 2 n2或更高但整體二分則可以迅速處理多個詢問的問題 首先需要離線,讀入所有詢問 然後我們二分答案,這時候我們將詢問分成兩個部分,如果l r就直接更新答案,否則考慮分治,詢問的答案在左邊的丟到左邊,答案在右邊的則丟到右邊...