UVA 572 - Oil Deposits

版权声明:未经本人同意,禁止转载。 https://blog.csdn.net/qq_34022601/article/details/84112618

这道题是一道八连通图的问题。貌似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;
} 

猜你喜欢

转载自blog.csdn.net/qq_34022601/article/details/84112618
今日推荐