UVA 572 - Oil Deposits
阿新 • • 發佈:2018-12-01
這道題是一道八連通圖的問題。貌似POJ上也有一題類似的。思路蠻簡單的,就是圖的BFS遍歷的演算法。要遍歷圖的每一個頂點才行。
但是,我在BFS時把 ‘@’ 置換為‘*’,這樣我就不會再一次遍歷到同一塊油田了。
#include <cstdio> #include <queue> using namespace std; char s[102][102]; //位向量 int dx[8]={0,0,-1,-1,-1,1,1,1}; int dy[8]={-1,1,-1,0,1,-1,0,1}; int n,m; void BFS(int i,int j) { int x,y; pair <int ,int> p; queue <pair<int,int> > q; p.first=i;p.second=j; q.push(p); while(!q.empty()) { x=q.front().first; y=q.front().second; q.pop(); for (int i=0;i<8;i++) { if (x+dx[i]>=0&&x+dx[i]<n&&y+dy[i]>=0&&y+dy[i]<m&&s[x+dx[i]][y+dy[i]]=='@') { p.first=x+dx[i]; p.second=y+dy[i]; s[x+dx[i]][y+dy[i]]='*';//置換 q.push(p); } } } } int main() { int c; while(~scanf ("%d %d",&n,&m)&&n&&m) { c=0; for (int i=0;i<n;i++) { scanf ("%s",s[i]);//輸入圖 } //每一個頂點的遍歷。 for (int i=0;i<n;i++) { for (int j=0;j<m;j++) { if (s[i][j]=='@') //發現油田時,數量++ { c++; BFS(i,j);//BFS把整塊油田變成 *,下次就不會被計算到了. } } } printf ("%d\n",c); } return 0; }