概述
这道题是一道八连通图的问题。貌似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所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复