【BFS】JZOJ·WZK旅游

本文介绍了一种使用广度优先搜索(BFS)算法来解析地形图的方法,旨在识别并计数地形图上的‘山’与‘湖’。通过遍历整个地形图,将相连的相同高度区域标记并判断其是否构成山或湖,最后统计数量。

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

题目大意:

有一片n*k的区域,如果在某个区域内
是一块连通的并且高度都相同区域,并且,这个区域的高度比其周围部分的高度都要高,则为“山”
或者一块连通的并且高度都相同区域,并且,这个区域的高度比其周围部分的高度都要低,则为“湖”
让你求有多少山多少湖。


思路:

用BFS把整个图扫一遍,将在一起(四周)的图用数组记录下来,然后判断是山还是湖(高就是山,低就是湖)。


CodeCodeCode:

#include<cstdio> 
#include<iostream>
#include<queue>
#define INF 12311215//预处理
using namespace std;
const int dx[5]={0,0,0,1,-1};//方向
const int dy[5]={0,1,-1,0,0};
int ball[1250][1250],f[1250][1250];//ball是点,f用于记录
int n,l,m,maxn,minn,k;//m是山的数量,l是湖的数量,maxn是最高,minn是最低
queue<int>x;//定义队列
queue<int>y;
bool check(int x,int y,int z)//判断出界
{
	if(x<1 || x>n || y<1 || y>k)return 0;
	return 1;
}
void BFS(int xx,int yy)//xx是行,yy是列
{
	x.push(xx),y.push(yy);//入队
	f[xx][yy]=1;//标记
	while(x.size())//在队列
	{
		int xxx=x.front();x.pop();//xxx是x队列的头
		int yyy=y.front();y.pop();//yyy是y队列的头
		for(int i=1;i<=4;++i)//四周(无对角)
			if(check(xxx+dx[i],yyy+dy[i],ball[xxx][yyy]))//判断范围
			{
				if(ball[xxx+dx[i]][yyy+dy[i]]==ball[xx][yy])//判断每个点的高度
				{
					if(!f[xxx+dx[i]][yyy+dy[i]])
					{
						f[xxx+dx[i]][yyy+dy[i]]=1;
						x.push(xxx+dx[i]);
						y.push(yyy+dy[i]);
					}
				}
				else
				{
					minn=min(minn,ball[xxx+dx[i]][yyy+dy[i]]);//最高
					maxn=max(maxn,ball[xxx+dx[i]][yyy+dy[i]]);//最低
				}
			}
	}
}
int main()
{
	freopen("seek.in","r",stdin);//文件输入输出
	freopen("seek.out","w",stdout);
	scanf("%d%d",&n,&k);
	for(int i=1;i<=n;i++)
	for(int j=1;j<=k;j++)
	scanf("%d",&ball[i][j]);
	for(int i=1;i<=n;i++)
    	for(int j=1;j<=k;j++)
		if(!f[i][j])//没被标记
     	{
           minn=INF;//初始化
		   maxn=-INF;
		   BFS(i,j);//搜
		   if(minn>ball[i][j] && minn!=INF)
		   l++;//湖
		   if(maxn<ball[i][j] && maxn!=-INF)
		   m++;//山
	    }
	printf("%d %d",l,m); //输出
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值