Rezolvare completă PbInfo #1451 Iceberg

Cerința

Se dă o matrice reprezentând o zonă dintr-un ocean ce conține un iceberg; valorile egale cu 1 fac parte din iceberg, iar cele egale cu 0 reprezintă apă.

Se știe că icebergul este înconjurat de apa (nu există nici o valoare de 1 pe marginea matricei) și că într-un interval de timp se topesc toate zonele icebergului care au cel puțin doua laturi vecine cu apa.

Determinați și afișați cate intervale de timp sunt necesare ca icebergul să se topească în întregime. De asemenea, afișați pentru fiecare interval de timp câte poziții de gheață are icebergul la începutul intervalului.

Date de intrare

Programul citește de la tastatură numărul n, iar apoi o matrice de n linii și n coloane reprezentând zona icebergului.

Date de ieșire

Programul va afișa pe ecran numărul t reprezentând numărul de intervale de timp și t numere naturale reprezentând suprafața ghețarului la începutul fiecărui interval.

Restricții și precizări

  • 1 ≤ n ≤ 31
  • Elementele de pe marginile matricii sunt tot timpul 0

Exemplu

Intrare

7
0 0 0 0 0 0 0 
0 1 1 1 1 1 0 
0 0 1 1 1 0 0 
0 0 1 1 1 0 0 
0 1 1 1 1 1 0 
0 0 0 0 0 0 0
0 0 0 0 0 0 0

Ieșire

4
16
12
8
2

Explicație

După primul interval de timp ghețarul arată astfel:

0 0 0 0 0 0 0 
0 0 1 1 1 0 0 
0 0 1 1 1 0 0 
0 0 1 1 1 0 0 
0 0 1 1 1 0 0 
0 0 0 0 0 0 0 

După cel de-al doilea interval de timp ghețarul arată astfel:

0 0 0 0 0 0 0 
0 0 0 1 0 0 0 
0 0 1 1 1 0 0 
0 0 1 1 1 0 0 
0 0 0 1 0 0 0 
0 0 0 0 0 0 0 

După cel de-al treilea interval de timp ghețarul arată astfel:

0 0 0 0 0 0 0 
0 0 0 0 0 0 0 
0 0 0 1 0 0 0 
0 0 0 1 0 0 0 
0 0 0 0 0 0 0 
0 0 0 0 0 0 0 

iar la pasul următor se topește de în întregime.

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 Iceberg:

#include <iostream>
using namespace std;
int a[31][31],p[100],n,t=0;
void citire()
{
    int i,j;
    cin>>n;
    for(i=0;i<n;i++)
        for(j=0;j<n;j++)
             cin>>a[i][j];
}
int main()
{
    int i,k,j,s=0;
    citire();
    for(i=0;i<n;i++)
        for(j=0;j<n;j++)
            {
              s=s+a[i][j];
              p[t]=s;
            }
    while(s>0)
    {
        s=p[t];
        for(i=1;i<n-1;i++)
            for(j=1;j<n-1;j++)
            if(a[i][j]==1)
            {
                k=0;
                if(a[i-1][j]==0) k++;
                if(a[i+1][j]==0) k++;
                if(a[i][j-1]==0) k++;
                if(a[i][j+1]==0) k++;
                if(k>=2)
                {
                    s--;
                    a[i][j]=2;
                }
            }
        t++;
        p[t]=s;
        for(i=1;i<n-1;i++)
            for(j=1;j<n-1;j++)
               if(a[i][j]==2) a[i][j]=0;
    }
    cout<<t<<"\n";
    for(i=0;i<t;i++) cout<<p[i]<<"\n";
    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 #1451 Iceberg

Pe această pagină găsești rezolvarea de 100 de puncte pentru problema #1451 Iceberg 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!