有一个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;
}