• b_jd_水坑数量(向外流dfs)


    有一个n*m的地图,每个格子的大小表示地板的高度,有一天下雨了,问这个地图有多少个水坑(n,m<100)

    思路:从高到低向外流,能流出界的就不会被淹没

    #include<bits/stdc++.h>
    using namespace std;
    const int N=105;
    int n, m;
    int g[N][N];
    bool ret[N][N], vis[N][N];
    int d[4][2] = { {1,0},{0,-1},{0,1},{-1,0} };
    bool inArea(int x, int y) {
        return x>=0 && x<n && y>=0 && y<m;
    }
    bool dfs(int x, int y, int v) {
        if (!inArea(x,y)) return true;
        if (vis[x][y]) return false;
        if (g[x][y]>v) return false;
        vis[x][y]=1;
        return dfs(x-1,y,v) || dfs(x,y-1,v) || dfs(x+1,y,v) || dfs(x,y+1,v);
    }
    void f(int x, int y) {
        ret[x][y]=1;
        for (int k=0; k<4; k++) {
            int tx=x+d[k][0], ty=y+d[k][1];
            if (inArea(tx,ty) && ret[tx][ty]==0) {
                f(tx,ty);
            }
        }
    }
    int main() {
        std::ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
        cin>>n>>m;
        for (int i=0; i<n; i++)
        for (int j=0; j<m; j++)
            cin>>g[i][j];
        
        for (int i=0; i<n; i++)
        for (int j=0; j<m; j++) {
            memset(vis,false,sizeof vis);
            ret[i][j]=dfs(i,j,g[i][j]);
        }
        int ans=0;
        for (int i=0; i<n; i++)
        for (int j=0; j<m; j++)  if (ret[i][j]==0) {
            ans++;
            f(i,j);
        }
        cout<<ans;
        return 0;
    }
    
  • 相关阅读:
    C#中的WebBrowser控件的使用
    触发器
    SQL Server存储机制
    mongodb客户端操作常用命令
    动态居中方法
    关于node不需要重启即可刷新页面
    测试一个段落里面是否含有数字
    表单验证
    关于echarts和jquery的结合使用问题
    js函数获取ev对象
  • 原文地址:https://www.cnblogs.com/wdt1/p/14587016.html
Copyright © 2020-2023  润新知