Problema de bloque conectado de salida dfs

Excursión

Descripción

Xiaobai y su amigo se reunieron el fin de semana para salir de excursión al Cañón del Invocador. Descubrieron que el mapa de Summoner's Canyon estaba formado por cuadrículas, algunas de las cuales estaban cubiertas de hierba y otras eran espacios abiertos. Los pastos expanden otros pastos en 4 direcciones hacia arriba, abajo, izquierda y derecha para formar un pasto Las rejillas en cualquier trozo de hierba son pastos, y todas las rejillas se pueden conectar hacia arriba, abajo, izquierda y derecha. Si usa '#' para representar pasto y '.' Para representar tierra abierta, hay 2 praderas en el cañón de abajo.

##…

… ##

Dos personas en la misma pradera pueden verse, pero la gente en la pradera no se puede ver en el espacio abierto. Descubrieron que uno de sus amigos había desaparecido y ahora necesitan buscarlos por separado, todos están a cargo de un trozo de césped y quieren saber cuántas personas necesitan al menos.

Aporte

Ingrese n, m (1 ≤ n, m ≤ 100) en la primera línea para indicar el tamaño del cañón.

Luego, ingrese n líneas de cuerdas para representar el terreno del cañón.

Producción

Al menos cuántas personas se necesitan para producir.

Entrada de muestra 1

5 6.
#……
#
…… #… #
… ##.
. #…
Salida de muestra 1

5

#include<bits/stdc++.h>
using namespace std;
long long cnt=0;//cnt的数值可能会大于int类型
int n,m,nx[4][2]={
    
    {
    
    0,1},{
    
    1,0},{
    
    -1,0},{
    
    0,-1}};//运用于方位的转化 
int vis[110][110]={
    
    0};
char mp[110][110];

bool in(int x,int y){
    
    
	return x>-1&&x<n&&y>-1&&y<m;//运用于移动后的位置是否合法 
}

void dfs(int x,int y){
    
    
	for(int i=0;i<=3;i++){
    
    
		int nowx=x+nx[i][0];//进行方位转化 
		int nowy=y+nx[i][0];
		if(in(nowx,nowy)&&mp[nowx][nowy]=='#'&&!vis[nowx][nowy]){
    
    //是否出局 是否能放 是否已经被放了 
			vis[nowx][nowy]=1;
			dfs(nowx,nowy);//进行dfs搜索 
		}
	}
}


int main(){
    
    
	cin>>n>>m;
	for(int i=0;i<n;i++){
    
    
		cin>>mp[i];
	}
	for(int i=0;i<n;i++){
    
    
		for(int j=0;j<m;j++){
    
    
			if(mp[i][j]=='#'&&!vis[i][j]){
    
    //能放就进行cnt++ 
			cnt++;
			vis[i][j]=1;
			dfs(i,j);	
			}
		}
	}
	cout<<cnt;
	return 0;	
} 

Supongo que te gusta

Origin blog.csdn.net/qq_47874905/article/details/109011751
Recomendado
Clasificación