Defender la solución del problema de la granja (bfs)

Una pregunta que no es amigable para los principiantes BFS: defender la granja (Luogu p2919)

Luogu p2919


El título describe que el
granjero del granjero John tiene muchas colinas pequeñas y quiere colocar algunos guardaespaldas allí para defender sus valiosas vacas.

Quería saber cuántos guardaespaldas necesitaría reclutar si desplegaba un guardaespaldas en una pequeña colina. Ahora tiene un mapa que usa una matriz de números para representar el terreno. Esta matriz tiene N filas (1 <N≤100) y M columnas (1 <M≤70). Cada elemento de la matriz tiene un valor H_ij (0≤H_ij≤10000) para indicar la altitud del área. Ayúdelo a contar cuántas colinas pequeñas hay en el mapa.

La definición de una pequeña colina es: si todos los elementos adyacentes a un elemento en el mapa no son más altos que la altura de este elemento (o es adyacente al borde del mapa) (es decir, menor o igual a), entonces el elemento y todo su entorno están en este orden. El conjunto de elementos dispuestos se llama pequeña colina. El significado de adyacencia aquí es: si la diferencia entre un elemento y otra abscisa ordenada y su abscisa y ordenada no excede 1, entonces se dice que los dos elementos son adyacentes. (Es decir, hay 8 puntos adyacentes a un punto sin límite, arriba, abajo, izquierda, derecha, arriba a la izquierda, arriba a la derecha, abajo a la izquierda, abajo a la derecha)

Formato de entrada: la
primera línea, dos números enteros N y M separados por espacios;

La segunda línea de la línea N + 1, la línea I + 1 describe la línea I en el mapa, hay M enteros H_ij separados por espacios.

Formato de salida:
una línea, el número de pequeñas colinas.

Ejemplo de entrada:
8 7
4 3 2 2 1 0 1
3 3 3 2 1 0 1
2 2 2 1 0 0
2 1 1 1 1 0 0
1 1 0 0 0 1 0
0 0 0 1 1 1 0
0 1 2 2 1 1 0
0 1 1 1 2 1 0
Ejemplo de salida:
3

Descripción de ejemplo:
Hay tres colinas pequeñas en el mapa: la posición máxima de cada colina está en la esquina superior izquierda (la altura es 4), la esquina superior derecha (la altura es 1) y la parte inferior (la altura es 2).


A primera vista, creo que necesito usar dfs, pero el profesor estipula que necesito usar bfs (o eliminar el código)
, así que no merezco aprender bfs ...


Código 0 (+ no entendí la pregunta no llegué a conocer el uso de bfs) (de hecho, el título no describe claramente) olla de rechazo loco

#include<iostream>
#include<algorithm>
#include<queue>
#include<cmath>

using namespace std;

int n,m,ans,kx,ky,map[105][105],a[105][105];
int dx[10]={
    
    0,0,1,-1};
int dy[10]={
    
    1,-1,0,0};

void check(int x,int y)//找到一个判断是不是山丘,后面发现题目不是这样的
{
    
    
	int sum=0;
	if(a[x][y+1]<=a[x][y]&&map[x][y+1]==0)
	sum++;
	if(a[x][y-1]<=a[x][y]&&map[x][y-1]==0)
	sum++;
	if(a[x+1][y]<=a[x][y]&&map[x+1][y]==0)
	sum++;
	if(a[x-1][y]<=a[x][y]&&map[x-1][y]==0)
	sum++;
	if(a[x+1][y+1]<=a[x][y]&&map[x+1][y+1]==0)
	sum++;
	if(a[x+1][y-1]<=a[x][y]&&map[x+1][y-1]==0)
	sum++;
	if(a[x-1][y+1]<=a[x][y]&&map[x-1][y+1]==0)
	sum++;
	if(a[x-1][y-1]<=a[x][y]&&map[x-1][y-1]==0)
	sum++;
	if(sum==8)
	ans++;
	return;
}

void bfs()
{
    
    
	queue<int> qx;
	queue<int> qy;
	qx.push(1);
	qy.push(1);
	kx=qx.front();
	ky=qy.front();
	map[kx][ky]=1;
	while(qx.empty()==0&&qy.empty()==0)
	{
    
    
		kx=qx.front();
		ky=qy.front();
		check(kx,ky);
		for(int i=0;i<4;i++)
		{
    
    
			if(map[kx+dx[i]][ky+dy[i]]==0)
			{
    
    
				map[kx+dx[i]][ky+dy[i]]=1;
				qx.push(kx+dx[i]);
				qy.push(ky+dy[i]);
			}
		}
		qx.pop();
		qy.pop();
	}
	return;
}

int main()
{
    
    
	cin>>n>>m;
	for(int i=1;i<=n;i++)
	{
    
    
		for(int j=1;j<=m;j++)
		{
    
    
			cin>>a[i][j]; 
		} 
	}
	for(int i=1;i<=m;i++)
	{
    
    
		map[0][i]=1;
		map[n+1][i]=1;
	}
	for(int i=1;i<=n;i++)
	{
    
    
		map[i][0]=1;
		map[i][m+1]=1;
	}
    bfs();
    cout<<ans;
	return 0;
}

Entonces podemos saber leyendo las preguntas.

Entonces, el conjunto del elemento y todos los elementos circundantes dispuestos en este orden se llama pequeña colina

Pregunta:
En una matriz, si la altura de un elemento es mayor o igual que los otros ocho elementos adyacentes (que pueden tener
límites), entonces se puede usar como la cima de una colina, y esos ocho elementos se pueden difundir hacia afuera a Forman un estricto
Bloques que no se elevan. (Del jugador de calidad de usuario de Luogu Sun 1 Chao )

"En otras palabras, tienes que encontrar todas las colinas pequeñas"

Consejos:
dado que una colina puede contener otra colina, comenzar desde la más alta puede evitar efectivamente la acumulación repetida

Código AC

#include<iostream>
#include<algorithm>
#include<queue>
#include<cmath>

using namespace std;

int n,m,ans,kx,ky,map[105][105],maps[105][105],a[105][105];
int dx[10]={
    
    0,0,0 ,1,1,1 ,-1,-1,-1};
int dy[10]={
    
    0,1,-1,0,1,-1,0 ,1 ,-1};
struct quick_sort//用于快排
{
    
    
	int x,y,h;
}p[100005];

void bfs(int x,int y)//bfs套路模板   $没有奇奇怪怪的骚操作$
{
    
    
	queue<int> qx;
	queue<int> qy;
	qx.push(x);
	qy.push(y);
	while(qx.empty()==0&&qy.empty()==0)
	{
    
    
		kx=qx.front();
		ky=qy.front();
		for(int i=1;i<=8;i++)
		{
    
    
			if(map[kx+dx[i]][ky+dy[i]]==0&&a[kx+dx[i]][ky+dy[i]]<=a[kx][ky]&&(kx+dx[i]>=1&&kx+dx[i]<=n)&&(ky+dy[i]>=1&&ky+dy[i]<=m))//边界
			{
    
    
				map[kx+dx[i]][ky+dy[i]]=1;//标记
				qx.push(kx+dx[i]);
				qy.push(ky+dy[i]);
			}
		}
		qx.pop();
		qy.pop();
	}
	return;
}
bool cmp(quick_sort a,quick_sort b)
{
    
    
	return a.h>b.h;
}

int main()
{
    
    
	cin>>n>>m;
	int w=0;
	for(int i=1;i<=n;i++)
	{
    
    
		for(int j=1;j<=m;j++)
		{
    
    
			cin>>a[i][j]; 
			w++;
			p[w].h=a[i][j];
			p[w].x=i;
			p[w].y=j;
		} 
	}
	sort(p+1,p+1+w,cmp); //由于一个山丘里面可能包含另一个山丘,从最高的开始找可以有效避免重复累加
	for(int i=1;i<=w;i++)
	{
    
    
		if(map[p[i].x][p[i].y]==0)//这个点不属于任何一座山
		{
    
    
		map[p[i].x][p[i].y]=1;
		bfs(p[i].x,p[i].y);
		ans++;	
		}
		
	}
    cout<<ans;
	return 0;
}

Código amigable para principiantes de Bfs (realmente sin esas operaciones muy llamativas)

void bfs(int x,int y)
{
    
    
	queue<int> qx;
	queue<int> qy;
	qx.push(x);
	qy.push(y);
	map[kx][ky]=1;
	while(qx.empty()==0&&qy.empty()==0)
	{
    
    
		kx=qx.front();
		ky=qy.front();
		for(int i=1;i<=8;i++)
		{
    
    
			if(map[kx+dx[i]][ky+dy[i]]==0&&......&&(...>=1&&...<=n)&&(...>=1&&...<=m))
			{
    
    
				map[kx+dx[i]][ky+dy[i]]=1;
				qx.push( );
				qy.push( );
			}
		}
		qx.pop();
		qy.pop();
	}
	return;
}

ε = (´ο ` *))) ay, bfs es demasiado difícil

Supongo que te gusta

Origin blog.csdn.net/yyh0910/article/details/115190761
Recomendado
Clasificación