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;
}
原文地址:https://www.cnblogs.com/wdt1/p/14587016.html