1. 程式人生 > >UVA 572 - Oil Deposits

UVA 572 - Oil Deposits

這道題是一道八連通圖的問題。貌似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;
}