【POJ2386】 Conteo de lagos (búsqueda profunda y búsqueda amplia)

Conteo de lago

Límite de tiempo: 1000MS Límite de memoria: 65536K
Total de envíos: 17917 Aceptados: 9069

Descripción

Debido a las lluvias recientes, el agua se ha acumulado en varios lugares del campo Farmer John, que está representado por un rectángulo de N x M (1 <= N <= 100; 1 <= M <= 100) cuadrados. Cada cuadrado contiene agua ('W') o tierra seca ('.'). Al granjero John le gustaría saber cuántos estanques se han formado en su campo. Un estanque es un conjunto conectado de cuadrados con agua en ellos, donde un cuadrado se considera adyacente a los ocho de sus vecinos.

Dado un diagrama del campo del granjero John, determina cuántos estanques tiene.

Entrada

  • Línea 1: dos enteros separados por espacios: N y M

  • Líneas 2..N + 1: M caracteres por línea que representan una fila del campo Farmer John. Cada carácter es 'W' o '.'. Los personajes no tienen espacios entre ellos.

Salida

  • Línea 1: El número de estanques en el campo de Farmer John.

Entrada de muestra

10 12

W........WW.
.WWW.....WWW
....WW...WW.
.........WW.
.........W..
..W......W..
.W.W.....WW.
W.W.W.....W.
.W.W......W.
..W.......W.

Salida de muestra

3

Esta pregunta es una copia del problema del campo petrolífero. La idea principal de la pregunta es encontrar los bloques compuestos por W (un bloque está conectado por varios W y puede estar conectado por barras). Hay varios.
El problema es muy simple, haz un bucle para encontrar W y establece el conectado como '.'. Si el número de bloques es +1, está bien.
Aquí hay dos métodos:
búsqueda profunda:

#include "iostream"
#include "cstdio"
#include "cstring"
#include "algorithm"
#include "math.h"

using namespace std;

const int maxn = 1e2+5;

char map[maxn][maxn];
int n,m;
int changeX[8]={
   
   0,0,1,1,1,-1,-1,-1};
int changeY[8]={
   
   1,-1,1,-1,0,1,-1,0};

int check(int x,int y){
    if(x<0||y<0||x>n||y>m||map[x][y]!='W') return 0;
    return 1;
}

void dfs(int x,int y){
    int i;
    for(i=0 ; i<8 ; i++){
        int nowX = x+changeX[i];
        int nowY = y+changeY[i];
        if(check(nowX,nowY)){
            map[nowX][nowY]='.';
            dfs(nowX,nowY);
        }
    }
}

int main(){
    while(~scanf("%d%d",&n,&m)){
        int ans=0;
        for(int i=0 ; i<n ; i++){
            for(int j=0 ; j<m ; j++){
                cin>>map[i][j];
            }
        }
        for(int i=0 ;i<n ; i++){
            for(int j=0 ;j<m ; j++){
                if(map[i][j]=='W'){
                    dfs(i,j);
                    ans++;
                }
            }
        }
        printf("%d\n",ans);
    }
    return 0;
}

Búsqueda amplia:

#include "iostream"
#include "cstdio"
#include "cstring"
#include "algorithm"
#include "math.h"
#include "queue"

using namespace std;

const int maxn = 1e2+5;

char map[maxn][maxn];
int n,m;
int ans;
int changeX[8]={
   
   0,0,1,1,1,-1,-1,-1};
int changeY[8]={
   
   1,-1,1,-1,0,1,-1,0};

struct FYJ{
    int x;
    int y;
};

int check(int x,int y){
    if(x<0||y<0||x>n||y>m||map[x][y]!='W')
    return 0;
    return 1;
}

void BFS(int x,int y){
    queue<FYJ>q;
    FYJ now,to;
    now.x=x; now.y=y;
    q.push(now);
    while(!q.empty()){
        now = q.front();
        q.pop();
        for(int i=0 ; i<8 ; i++){
            to.x=now.x+changeX[i];
            to.y=now.y+changeY[i];
            if(check(to.x,to.y)){
                q.push(to);
                map[to.x][to.y]='.';
            }
        }
    }
}

int main(){
    while(~scanf("%d%d",&n,&m)){
        ans = 0;
        for(int i=0 ; i<n ; i++){
            for(int j=0 ; j<m ; j++){
                cin>>map[i][j];
            }
        }
        for(int i=0 ; i<n ; i++){
            for(int j=0 ; j<m ; j++){
                if(map[i][j]=='W'){
                    ans++;
                    BFS(i,j);
                }
            }
        }
        printf("%d\n",ans);
    }
    return 0;
}

Supongo que te gusta

Origin blog.csdn.net/thesprit/article/details/51965049
Recomendado
Clasificación