HDU 1241 - Oil Deposits - [BFS]
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1241
题意:
求某块平面上,连通块的数量。一个油田格子若周围八个方向也有一个油田格子,则认为两者相连通。
AC代码:
#include<bits/stdc++.h> using namespace std; typedef pair<int,int> pii; const int maxn=105; const int dx[8]={0,1,0,-1,1,1,-1,-1}; const int dy[8]={1,0,-1,0,1,-1,1,-1}; int m,n; char mp[maxn][maxn]; int vis[maxn][maxn]; queue<pii> Q; inline bool in(pii o) { return 1<=o.first && o.first<=m && 1<=o.second && o.second<=n; } void bfs(int x,int y) { while(!Q.empty()) Q.pop(); vis[x][y]=1; Q.push(make_pair(x,y)); while(!Q.empty()) { pii now=Q.front(); Q.pop(); for(int k=0;k<8;k++) { pii nxt=make_pair(now.first+dx[k],now.second+dy[k]); if(!in(nxt)) continue; if(mp[nxt.first][nxt.second]=='*') continue; if(vis[nxt.first][nxt.second]) continue; Q.push(nxt); vis[nxt.first][nxt.second]=1; } } } int main() { while(scanf("%d%d",&m,&n) && m*n>0) { for(int i=1;i<=m;i++) scanf("%s",mp[i]+1); memset(vis,0,sizeof(vis)); int cnt=0; for(int i=1;i<=m;i++) { for(int j=1;j<=n;j++) { if(mp[i][j]=='@' && vis[i][j]==0) { cnt++; bfs(i,j); } } } cout<<cnt<<endl; } }
转载请注明出处:https://dilthey.cnblogs.com/