http://acm.hdu.edu.cn/showproblem.php?pid=1241
对每个还未访问的点bfs,到达的点都标为一块,最后统计有多少块即可
#include <cstdio> #include <cstring> #include <queue> using namespace std; const int maxn=101; const int inf=0x3fffffff; char maz[maxn][maxn]; int id[maxn][maxn]; int n,m,cnt; queue<int> que; const int dx[8]={0,0,1,-1,1,1,-1,-1}; const int dy[8]={1,-1,0,0,1,-1,1,-1}; bool in(int x,int y){ return x>=0&&x<n&&y>=0&&y<m; } void bfs(int sx,int sy){ while(!que.empty())que.pop(); id[sx][sy]=++cnt; que.push(sx*maxn+sy); while(!que.empty()){ int x=que.front()/maxn,y=que.front()%maxn;que.pop(); for(int i=0;i<8;i++){ int tx=x+dx[i],ty=y+dy[i]; if(in(tx,ty)&&maz[tx][ty]!=‘*‘&&id[tx][ty]==-1){ id[tx][ty]=id[x][y]; que.push(tx*maxn+ty); } } } } int main(){ while(scanf("%d%d",&n,&m)==2&&n){ cnt=0; for(int i=0;i<n;i++){ scanf("%s",maz[i]); } for(int i=0;i<n;i++){ for(int j=0;j<m;j++){ id[i][j]=-1; } } for(int i=0;i<n;i++){ for(int j=0;j<m;j++){ if(maz[i][j]!=‘*‘&&id[i][j]==-1){ bfs(i,j); } } } printf("%d\n",cnt); } return 0; }
时间: 2024-10-02 21:28:43