【POJ2386】 Comptage des lacs (recherche approfondie et recherche large)

Comptage des lacs

Limite de temps: 1000MS Limite de mémoire: 65536K
Nombre total de soumissions: 17917 Acceptées: 9069

La description

En raison des pluies récentes, l'eau s'est accumulée à divers endroits dans le champ du fermier John, qui est représenté par un rectangle de N x M (1 <= N <= 100; 1 <= M <= 100) carrés. Chaque carré contient de l'eau («W») ou de la terre ferme («.»). Le fermier John aimerait savoir combien d'étangs se sont formés dans son champ. Un étang est un ensemble connecté de carrés contenant de l'eau, où un carré est considéré comme adjacent aux huit de ses voisins.

À partir d'un diagramme du champ du fermier John, déterminez le nombre d'étangs dont il dispose.

Contribution

  • Ligne 1: deux entiers séparés par des espaces: N et M

  • Lignes 2..N + 1: M caractères par ligne représentant une ligne du champ du fermier John. Chaque caractère est soit «W» ou «.». Les caractères n'ont pas d'espaces entre eux.

Production

  • Ligne 1: Le nombre d'étangs dans le champ du fermier John.

Exemple d'entrée

10 12

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

Exemple de sortie

3

Cette question est une copie du problème du champ pétrolifère. L'idée principale de la question est de trouver les blocs composés de W (un bloc est relié par plusieurs W, et peut être relié par des barres obliques). Il y en a plusieurs.
Le problème est très simple, faites une boucle pour trouver W et définissez le connecté comme '.'. Si le nombre de blocs est +1, c'est bien.
Voici deux méthodes:
recherche approfondie:

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

Recherche large:

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

Je suppose que tu aimes

Origine blog.csdn.net/thesprit/article/details/51965049
conseillé
Classement