1. 程式人生 > >HDU 1241 - Oil Deposits - [BFS]

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; } }