• Acwing-----算法提高课第二章搜索(一)


    Flood Fill

    可以在线性时间复杂度内找到某个点所在的连通块

    1097.池塘计数

    #include <iostream>
    #include <algorithm>
    #include <cstring>
    using namespace std;
    
    const int N = 1010, M = N * N;
    typedef pair<int, int> PII;
    #define x first
    #define y second
    
    int n, m;
    char g[N][N];
    PII q[M];
    bool st[N][N];
    
    void bfs(int sx, int sy) {
        int hh = 0, tt = 0;
        q[0] = {sx, sy};
        st[sx][sy] = true;
      
        while (hh <= tt) {
            PII t = q[hh++];
            for (int i = t.x - 1; i <= t.x + 1; ++i) {
                for (int j = t.y - 1; j <= t.y + 1; ++j) {
                    if (i == t.x && j == t.y) continue;
                    if (i < 0 || i >= n || j < 0 || j >= m) continue;
                    if (g[i][j] == '.' || st[i][j]) continue;
            
                    q[++tt] = {i, j};
                    st[i][j] =  true;
                }
            }
        }
    }
    
    
    int main() {
        cin >> n >> m;
        for (int i = 0; i < n; ++i) cin >> g[i];
      
        int cnt = 0;
        for (int i = 0; i < n; ++i) {
            for (int j = 0; j < m; ++j) {
                if (g[i][j] == 'W' && !st[i][j]) {
                    bfs(i, j);
                    cnt++;
                }
            }
        }
        cout << cnt << endl;
        return 0;
    }
    

    1098.城堡问题

    #include <iostream>
    #include <algorithm>
    #include <cstring>
    
    using namespace std;
    const int N = 55, M = N * N;
    typedef pair<int, int> PII;
    #define x first 
    #define y second
    int n, m, g[N][N];
    PII q[M];
    bool st[N][N];
    
    int bfs(int sx, int sy) {
        int dx[4] = {0, -1, 0, 1}, dy[4] = {-1, 0, 1, 0};
      
        int hh = 0, tt = 0;
        int area = 0;
        q[0] = {sx, sy};
        st[sx][sy] = true;
      
        while (hh <= tt) {
            PII t = q[hh++];
            area++;
            for (int i = 0 ; i< 4; ++i) {
                int a = t.x + dx[i], b = t.y + dy[i];
                if (a < 0 || a >= n || b < 0 || b >= m) continue;
                if (st[a][b]) continue;
                if (g[t.x][t.y] >> i & 1) continue;
                q[++tt] = {a, b};
                st[a][b] = true;
            }
        }
        return area;
    }
    
    int main() {
        cin >> n >> m;
        for (int i = 0 ; i < n; ++i) {
            for (int j = 0; j < m; ++j) {
                cin >> g[i][j];
            }
        }
        int cnt = 0, area = 0;
        for (int i = 0; i < n; ++i) {
            for (int j = 0; j < m; ++j) {
                if (!st[i][j]) {
                    area = max(area, bfs(i, j));
                    cnt ++;
                }
            }
        }
        cout << cnt << endl;
        cout << area << endl;
    }
    
    

    1106.山峰和山谷

    #include <iostream>
    #include <algorithm>
    using namespace std;
    
    const int  N = 1010, M = N * N;
    typedef pair<int, int> PII;
    #define x first
    #define y second
    int n, h[N][N];
    PII q[M];
    bool st[N][N];
    
    void bfs(int sx, int sy, bool& has_higher, bool& has_lower) {
        int hh = 0, tt = 0;
        q[0] = {sx, sy};
        st[sx][sy] = true;
        while (hh <= tt) {
            PII t = q[hh++];
      
            for (int i = t.x - 1; i <= t.x + 1; ++i) {
                for (int j = t.y - 1; j <= t.y + 1; ++j) {
                    if (i == t.x && j == t.y) continue;
                    if (i < 0 || i >= n || j < 0 || j >= n) continue;
                    if (h[i][j] != h[t.x][t.y]) {
                        if (h[i][j] > h[t.x][t.y]) has_higher = true;
                        else has_lower = true;
                    } else if (!st[i][j]) {
                        q[++tt] = {i, j};
                        st[i][j] = true;
                    }
                }
            }
        }
    }
    
    int main() {
        cin >> n;
      
        for (int i = 0; i < n; ++i) {
            for (int j = 0; j < n; ++j) {
                cin >> h[i][j];
            }
        }
      
        int peak = 0, valley = 0;
        for (int i = 0; i < n; ++i) {
            for (int j = 0; j < n; ++j) {
                if (!st[i][j]) {
                    bool has_higher = false, has_lower = false;
                    bfs(i, j, has_higher, has_lower);
                    if (!has_higher) peak++;
                    if (!has_lower) valley++;
                }
            }
        }
        cout << peak << " " << valley << endl;
        return 0;
    }
    

    1076.迷宫问题

    #include <iostream>
    #include <cstring>
    #include <algorithm>
    using namespace std;
    typedef pair<int, int> PII;
    #define x first
    #define y second
    
    const int N = 1010, M = N * N;
    int n, g[N][N];
    PII q[M], pre[N][N];
    
    void bfs(int sx, int sy) {
        int dx[4] = {-1, 0, 1, 0,}, dy[4] = {0, 1, 0, -1};
        int hh = 0, tt = 0;
        q[0] = {sx, sy};
      
        memset(pre, -1, sizeof pre);
        pre[sx][sy] = {0, 0};
        while (hh <= tt) {
            PII t = q[hh++];
            for (int i = 0; i < 4; ++i) {
                int a = t.x + dx[i], b = t.y + dy[i];
                if (a < 0 || a >= n || b < 0 || b >= n) continue;
                if (g[a][b]) continue;
                if (pre[a][b].x != -1) continue;
          
                q[++tt] = {a, b};
                pre[a][b] = t;
            }
        }
    }
    
    int main() {
        cin >> n;
        for (int i = 0; i < n; ++i) 
            for (int j = 0; j < n; ++j) 
                cin >> g[i][j];
          
        bfs(n - 1,n - 1);
        PII end(0, 0);
      
        while (true) {
            cout << end.x << " " << end.y << endl;
            if (end.x == n - 1 && end.y == n - 1) break;
            end = pre[end.x][end.y];
        }
        return 0;
    }
    

    188.武士风度的牛

    #include <iostream>
    #include <algorithm>
    #include <cstring>
    using namespace std;
    #define x first
    #define y second
    typedef pair<int, int> PII;
    
    const int N = 155, M = N * N;
    int n, m, dist[N][N];
    char g[N][N];
    PII q[M];
    
    int bfs() {
        int dx[8] = {-2, -1, 1, 2, 2, 1, -1, -2};
        int dy[8] = {1, 2, 2, 1, -1, -2, -2, -1};
        int sx, sy;
        for (int i = 0; i < n; ++i) {
            for (int j = 0; j < m; ++j) {
                if (g[i][j] == 'K') {
                    sx = i, sy = j;
                }
            }
        }
        int hh = 0, tt = 0;
        q[0] = {sx, sy};
        memset(dist, -1, sizeof dist);
        dist[sx][sy] = 0;
      
        while (hh <= tt) {
            PII t = q[hh++];
            for (int i = 0; i < 8; ++i) {
                int a = t.x + dx[i], b = t.y + dy[i];
                if (a < 0 || a >= n || b < 0 || b >= m) continue;
                if (g[a][b] == '*') continue;
                if (dist[a][b] != -1) continue;
          
                if (g[a][b] == 'H') return dist[t.x][t.y] + 1;
          
                dist[a][b] = dist[t.x][t.y] + 1;
                q[++tt] = {a, b};
            }
        }
        return -1;
    }
    
    int main() {
        cin >> m >> n;
        for (int i = 0; i < n; ++i) {
                cin >> g[i];   
        }
      
        cout << bfs() << endl;
        return 0;
    }
    
    

    1100.抓住那头牛

    #include <iostream>
    #include <algorithm>
    #include <cstring>
    
    using namespace std;
    const int N = 200010;
    
    int n, k;
    int q[N];
    int dist[N];
    
    int bfs() {
        memset(dist, -1, sizeof dist);
        dist[n] = 0;
        q[0] = n;
      
        int hh = 0, tt = 0;
        while (hh <= tt) {
            int t = q[hh++];
            if (t == k) return dist[k];
            if (t + 1 < N && dist[t + 1] == -1) {
                dist[t + 1] = dist[t] + 1;
                q[++tt] = t + 1;
            }
            if (t - 1 >= 0 && dist[t - 1] == -1) {
                dist[t - 1] = dist[t] + 1;
                q[++tt] = t - 1;
            }
            if (t * 2 < N && dist[t * 2] == -1) {
                dist[t * 2] = dist[t] + 1;
                q[++tt] = t * 2;
            }
        }
        return -1;
    }
    
    int main() {
        cin >> n >> k;
        cout << bfs() << endl;
        return 0;
    }
    
  • 相关阅读:
    计算机书籍.网址
    MVC是必知必用的
    技术
    三色旗帜分类
    巴斯卡三角形
    Centos安装wine等组件的问题
    some software that is used to speed up your system
    驾照考试系统之流程图
    用静态成员函数调用非静态成员变量
    MFC 进度条控件
  • 原文地址:https://www.cnblogs.com/clown9804/p/13714416.html
Copyright © 2020-2023  润新知