题目描述
Flood Fill.用bfs或者dfs判断图中有几个独立的块
C++ 代码
#include<iostream>
#include<cstring>
#include<algorithm>
#include<queue>
#define x first
#define y second
using namespace std;
typedef pair<int,int> PII;
const int N=1005;
char g[N][N];
int st[N][N];
int n;
void bfs(int sx,int sy,int &bound,int &total){
bound=0,total=0;
queue<PII> Q;
PII t;
Q.push({sx,sy});
st[sx][sy]=true;
int dx[4]={0,1,0,-1},dy[4]={1,0,-1,0};
while(Q.size()){
t=Q.front();Q.pop();
total++;//这一句应该放到最前面 bound total 在母位置判断加否
bool is_bound=false;
for(int i=0;i<4;i++){//没举 母位置延伸的四个子位置
int x=t.x+dx[i],y=t.y+dy[i];
if(x<0||x>=n||y<0||y>=n)continue;
if(g[x][y]=='.'){
is_bound=true;
continue;
}
if(st[x][y])continue;
st[x][y]=true;
Q.push({x,y});
}
if(is_bound) bound++;
}
}
int main()
{
cin>>n;
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)cin>>g[i][j];
int cnt=0;
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
if(!st[i][j]&&g[i][j]=='#'){
int bound=0,total=0;
bfs(i,j,bound,total);
if(bound==total)cnt++;//被完全淹没的陆地
}
}
}
cout<<cnt<<"\n";
return 0;
}