HDU 1241 - Oil Deposits - [BFS]
阿新 • • 發佈:2018-10-31
題目連結: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; charmp[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; } }