POJ 1562 Oil Deposits
题目大意:
在一块矩形的土地上有些取余有石油,含有石油的区域用符号@表示,不含有石油的取余用符号*表示。规定相连的两块石油是同一块油田(在某一块石油上下左右或斜上斜下的石油和它一起组成一块油田),编写一个程序计算出油田的数量。输入包含多组数据,每组数据的第一行为矩形土地的行数与列数,接下来的一个矩阵即为这个矩形土地,当读入的行数与列数都为0时输入结束。输出包含多行,每一行包含对应的一组数据的答案。
题目算法:
本题十分的简单,一看到题目就知道使用广搜的方法,同时只要用普通的广搜即可。通过建立一个bool类型的visited二维数组,该数组表示某个格子是否被统计过。在main函数中通过一个循环来遍历整个读入的字符矩阵,如若遍历的该格子是@字符并且visited数组表示该格子未被统计,则进行一次广搜并且cnt加1,最后输出cnt即可。广搜的过程中要记得把遍历到的格子的visited该为统计过。AC程序如下:
#include<iostream>
#include<cstring>
using namespace std;
struct point
{
int x,y;
} que[100001];
bool visited[105][105];
char s[105][105];
int m,n,cnt=0;
const int dx[8]={-1,-1,0,1,1,1,0,-1},dy[8]={0,1,1,1,0,-1,-1,-1};
void bfs();
int main()
{
while(cin>>n>>m&&n&&m)
{
cnt=0;
memset(visited,false,sizeof(visited));
for(int i=1;i<=n;++i)
for(int j=1;j<=m;++j)
cin>>s[i][j];
for(int i=1;i<=n;++i)
for(int j=1;j<=m;++j)
if(s[i][j]=='@'&&!visited[i][j])
{
que[1].x=i;
que[1].y=j;
visited[i][j]=true;
bfs();
++cnt;
}
cout<<cnt<<endl;
}
}
void bfs()
{
int head=0,tail=1;
while(head<tail)
{
++head;
for(int i=0;i<=7;++i)
{
int xx=que[head].x+dx[i],yy=que[head].y+dy[i];
if(xx>=1&&xx<=n&&yy>=1&&yy<=m&&!visited[xx][yy]&&s[xx][yy]=='@')
{
visited[xx][yy]=true;
que[++tail].x=xx;
que[tail].y=yy;
}
}
}
}
本题可以说是一道很简单的题目了, 一下子就AC了。如果有更好的方法大家可以补充说明哦!