#include"stdio.h"
#include"stdlib.h"
#include"queue"
#include"string.h"
using namespace std;
typedef long long ll;
int dir[12][2]={{0,2},{0,-2},{2,0},{-2,0},{1,1},{1,-1},{-1,1},{-1,-1},{1,0},{-1,0},{0,1},{0,-1}};
int n;
int visit[100+10][100+10];
char g[100+10][100+10];
int r,c;
int check(int nx,int ny)
{
return nx>=0&&nx<r&&ny>=0&&ny<c&&g[nx][ny]=='#'&&visit[nx][ny]==0;
}
void dfs(int si,int sj)
{
visit[si][sj]=1;
int i;
for(i=0;i<12;i++)
{
int nx=si+dir[i][0];
int ny=sj+dir[i][1];
if(check(nx,ny))
{
visit[nx][ny]=1;
dfs(nx,ny);
}
}
}
void bfs(int si,int sj)
{
queue<pair<int,int> >Q;
Q.push(make_pair(si,sj));
visit[si][sj]=1;
while(!Q.empty())
{
pair<int,int> u=Q.front();Q.pop();
for(int i=0;i<12;i++)
{
int nx=u.first+dir[i][0];
int ny=u.second+dir[i][1];
if(check(nx,ny))
{
Q.push(make_pair(nx,ny));
visit[nx][ny]=1;
}
}
}
}
int main()
{
int i;
while(scanf("%d%d",&r,&c)==2)
{
getchar();
for(int i=0;i<r;i++)
{
for(int j=0;j<c;j++)
g[i][j]=getchar();
getchar();
}
int ans=0;
memset(visit,0,sizeof(visit));
/*
for(int i=0;i<r;i++)
for(int j=0;j<c;j++)
if(check(i,j))
{
dfs(i,j);
ans++;
}
*/
for(int i=0;i<r;i++)
for(int j=0;j<c;j++)
if(check(i,j))
{
bfs(i,j);
ans++;
}
printf("%d\n",ans);
}
return 0;
}
vijos 1051 BFS/DFS 连通块
最新推荐文章于 2022-05-11 22:43:50 发布
