---
# System prepended metadata

title: 真‧基礎搜索方法
tags: [搜索]

---

---
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
:::