我是靠谱客的博主 辛勤灰狼,最近开发中收集的这篇文章主要介绍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 ("%dn",c);
	}
	return 0;
} 

 

最后

以上就是辛勤灰狼为你收集整理的UVA 572 - Oil Deposits的全部内容,希望文章能够帮你解决UVA 572 - Oil Deposits所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(88)

评论列表共有 0 条评论

立即
投稿
返回
顶部