POJ 1562 Oil Deposits (广度优先搜索)

本文介绍了解决POJ1562 OilDeposits问题的方法,利用广度优先搜索(BFS)算法计算矩形土地上的油田数量。通过遍历地图并使用bool类型的visited数组标记已访问的油田区块,确保每个区块只被计算一次。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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了。如果有更好的方法大家可以补充说明哦!                               







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值