[Ybt] [Ejemplo 2 de búsqueda exhaustiva de cálculo base ejemplar] Picos y valles

Picos y valles montañosos

Enlace de tema: picos y valles


Descripción del Título

Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí

Ideas para resolver problemas

Preguntas de plantilla de búsqueda amplia.

Tenga en cuenta que hay ocho conexiones.

Solo bajo, luego la montaña

Solo alto, luego el valle

Si hay un entorno alto y bajo, no es una montaña ni un valle.

Si no hay alto ni fondo, incluso el pico es un valle.

código

#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;
}

Supongo que te gusta

Origin blog.csdn.net/SSL_guyixin/article/details/112131884
Recomendado
Clasificación