---
tags: 搜索
title: 真‧基礎搜索方法
---
# 基礎搜索方法:
- BinS(二分搜)
- DFS(深度優先搜索)
- BFS(廣度優先搜索)
其實不只這些,這些只是在高中的程式競賽常用的方法~
:::success
## Binary Search
- 我要解決這個問題:
https://codeforces.com/problemset/problem/474/B
- 非專業&非google翻譯:
```txt=
給n堆物品,每堆物品A[i]個,每個物品被編碼,第一堆編碼1~A[1],第二堆編碼A[1]+1~A[2]+1,and so on.
給m個查詢,每個查詢是一個數字Q[i],代表物品編碼。
對於每筆查詢輸出物品Q[i]在第幾堆。
```
constrains:
N <= 10^5
M <= 10^5
(N)
A[1] ~ A[n]
(M)
Q[1] ~ Q[m]
123 4567 89 01234
ooo oooo oo ooooo
:::
:::success
## DFS (Depth First Search) & BFS (Breadth First Search)
- 我要解決這個問題:
http://domen111.github.io/UVa-Easy-Viewer/?11094
- 非專業&非google翻譯:
```txt=
給定一個二維地圖,地圖上每一格只有兩種可能字元:l表示大陸(Land),w表示水域(Water)
給定Mijid在圖上的座標,求Mijid佔的那塊大陸以外的 最大的大陸的面積。
詳細輸入輸出說明請自行看題目XDD
5 5
wwwww
wwllw
wwwww
wllww
wwwww
1 3
```
- 解題思路:
陸塊的大小可以從Mijid所在位置的上,下,左,右四個方向延伸,
所以每個方向都試試看還有沒有大陸
```cpp=
int m,n;//長寬
bool vis[20][20];//0->沒走過,1->走過
char grid[20][20];//地圖
int dx[] = {-1,1,0,0};
int dy[] = {0,0,-1,1};
int dfs(int x, int y){//回傳大小
//確保grid[x][y]是陸地
int ret = 1;//現在這塊~
vis[x][y] = 1;
/*
if(x > 0 && grid[x-1][y] == 'l')ret += dfs(x-1, y);//上
if(x < m-1 && grid[x+1][y] == 'l')ret += dfs(x+1, y);//下
if(y > 0 && grid[x][y-1] == 'l')ret += dfs(x, y-1);//左
if(y < n-1 && grid[x][y+1] == 'l')ret += dfs(x, y+1);//右
*/
for(int i = 0; i < 4; ++i){
int nx = x + dx[i], ny = y + dy[i];//嘗試下一格
if(0 <= nx && nx < m && 0 <= ny && ny < n && grid[nx][ny] == 'l' && !vis[nx][ny]){
ret += dfs(nx, ny);
}
}
return ret;
}
void solve(){
int ans = 0;
for(int i = 0; i < m; ++i){
for(int j = 0; j < n; ++j){
if(!vis[i][j] && grid[i][j] == 'l'){
ans = max(dfs(i, j), ans);
}
}
}
```
- 例題:
https://zerojudge.tw/ShowProblem?problemid=a982
:::