题目大意:
有一片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;
}