【ybt】【基算 广搜 课过 例2】山峰和山谷

山峰和山谷

题目链接:山峰和山谷


题目描述

在这里插入图片描述
在这里插入图片描述

解题思路

广搜模板题。

注意是八连通。

只有低,则山峰

只有高,则山谷

如果周围有高有低,则非山峰也非山谷。

如果没高也没底,则即使山峰又是山谷。

code

#include<iostream>
#include<cstdio>
using namespace std;

const int xn[9]={
    
    0,0,1,0,-1,1,1,-1,-1};
const int yn[9]={
    
    0,1,0,-1,0,1,-1,1,-1};

int n,sf,sg,ts;
int xx[10000000];
int yy[10000000];
int a[1010][1010];
int v[1010][1010];

void bfs(int sx,int sy)
{
    
    
	int hd=0,tl=1;
	int f=0,g=0;
	xx[1]=sx,yy[1]=sy;
	while(hd<tl)
	{
    
    
		hd++;
		for(int i=1;i<=8;i++)
		{
    
    
			int x=xx[hd]+xn[i];
			int y=yy[hd]+yn[i];
			if(x<1||x>n||y<1||y>n)
				continue;
			if(a[x][y]==a[xx[hd]][yy[hd]]&&!v[x][y])
			{
    
    
				tl++;
				xx[tl]=x;
				yy[tl]=y;
				v[x][y]=1;
			}
			{
    
    
				if(a[x][y]>a[xx[hd]][yy[hd]])
					g=1;
				if(a[x][y]<a[xx[hd]][yy[hd]])
					f=1;
			}
		}
	}
	if(g==1&&f==0)
		sg++;
	if(g==0&&f==1)
		sf++;
}

int main()
{
    
    
	cin>>n;
	for(int i=1;i<=n;i++)
		for(int j=1;j<=n;j++)
			scanf("%d",&a[i][j]);
	for(int i=1;i<=n;i++)
		for(int j=1;j<=n;j++)
			if(!v[i][j])
			{
    
    
				v[i][j]=1;
				bfs(i,j);
				ts++;
			}
	if(ts==1)
		cout<<1<<" "<<1<<endl;
	else
		cout<<sf<<" "<<sg<<endl;
}

猜你喜欢

转载自blog.csdn.net/SSL_guyixin/article/details/112131884