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就直接更新答案,否則考慮分治,詢問的答案在左邊的丟到左邊,答案在右邊的則丟到右邊...