Rezolvare completă PbInfo #837 Fill

Cerința

Se dă o matrice cu n linii și m coloane și elemente 0 sau 1, care reprezintă harta unei planete, în care 1 înseamnă uscat, iar 0 înseamnă apă. Două elemente 1 care se învecinează pe linie sau pe coloană (nu și pe diagonală) fac parte din același continent.

Să se determine câte continente sunt pe hartă.

Date de intrare

Fișierul de intrare fill.in conține pe prima linie numerele n m. Următoarele n linii conțin câte m elemente, 0 sau 1, cu semnificația din enunț.

Date de ieșire

Fișierul de ieșire fill.out va conține pe prima linie numărul C de continente existente.

Restricții și precizări

  • 1 ≤ n , m ≤ 100

Exemplu

fill.in

4 6
1 1 1 0 1 0
0 0 1 0 1 1
1 1 1 0 0 0
0 1 0 1 1 1

fill.out

3

Explicație

Cele 3 continente sunt evidenţiate mai jos:

Cum e corect?

cout < "As la info"; cout << "As la info"; cout >> "As la info";

Felicitări! Poți mai mult?

Avem sute de probleme pentru tine, fiecare cu explicații ușor de înțeles.

Greșit, dar nu-i bai!

Antrenează-te cu sutele de probleme pe care ți le-am pregătit. Îți explicăm fiecare problemă în parte.

Rezolvare

Iată rezolvarea de 100 de puncte pentru problema Fill:

#include <iostream>
#include <fstream>
using namespace std;

ifstream fin("fill.in");
ofstream fout("fill.out");

int n,m, a[102][102];

const int dx[]={0 , 0 , 1 , -1}, dy[]={1 , -1 , 0 , 0};

void fill(int i , int j , int valoare)
{
    a[i][j] = valoare;
    for(int k = 0 ; k < 4 ; k ++)
        if(a[i+dx[k]][j+dy[k]] == -1)
            fill(i+dx[k] , j+dy[k] , valoare);
}

int main(){
    fin >> n >> m;
    for(int i = 1 ; i <= n ; i ++)
        for(int j = 1 ; j <= m ; j ++)
            fin >> a[i][j] , a[i][j] = - a[i][j];
    fin.close();
    //bordare , chiar daca este inutila pentru aceasta problema
    for(int i = 0 ; i <= n + 1 ; i ++)
        a[i][0] = a[i][m+1] = 0;
    for(int j = 0 ; j <= m + 1; j ++)
        a[0][j] = a[n+1][j] = 0;
    //cautam valorile -1, le numaram si facem fill
    int cnt = 0;
    for(int i = 1 ; i <= n ; i ++)
        for(int j = 1 ; j <= m ; j ++)
            if(a[i][j] == -1)
            {
                cnt ++;
                fill(i , j , cnt);
            }
    fout << cnt ;
    fout.close();
    return 0;
}

Atenție

Enunțurile afișate pe această pagină aparțin exclusiv site-ului PbInfo. Astfel, pentru ștergerea conținutului, puteți să ne contactați la adresa Adresa de email.

Rezolvarea problemei #837 Fill

Pe această pagină găsești rezolvarea de 100 de puncte pentru problema #837 Fill de pe PbInfo.ro. Atenție: nu încurajăm copiatul codului! Totuși, credem cu tărie că analizarea unei soluții corecte este o metodă foarte ușoară de a învăța informatică, astfel că oferim sursele pentru peste 1500 de probleme de pe platforma PbInfo.ro.

Pentru rezolvări PbInfo de la peste 1500 de probleme, vă invităm să intrați pe site-ul nostru!