Sunteți pe pagina 1din 3

Aplicatie grafuri neorientate

Enuntul problemei: Harta unui arhipelag este codificata printr-o matrice binara patrata
unde suprafetele terestre sunt marcate cu 1 si cele marine cu 0. Sa se determine cate insule fac
parte din arhipelag. O insiula este compusa din unul sau mai multe elemente ale matricei
marcat cu 1, care se invecineaza pe directiile N, S, E, V .

Exemplu  :

1 1 0 1 1

( 0
In arhipelagul : 0
1
1
0
0
0
0
0
0
0
1
0
1
0
1
1

)
0 avem 5 insule, colorate diferit
0
1

Analiza problemei  :

 In primul rand, avem nevoie sa citim matricea arhipelagului, iar acest lucru se face
mai rapid cu ajutorul fisierelor ;
 Vom incepe sa cautam suprafete terestre incepand cu primul element al matricei
care are valoarea 1. Matricea nefiind neaparat simetrica, trebuie parcursa in
totalitate.
 Dupa ce se gaseste o suprafata terestra, contorul care numara insulele este
incrementat cu 1 si incepe cautarea suprafetelor teresstre vecine in Nord, Sud, Est si
Vest.
 Cautarea suprafetelor vecine foloseste principiul parcurgerii in adancime si anume :
o se viziteaza prima suprafata terestra vecina, care nu a fost vizitata anterior ;
o apoi urmatoarea suprafata vecina, care nu a mai fost vizitata ;
……………
o Se repeta algoritmul pana cand toate suprafetele terestre au fost vizitate.
 Pentru a marca ca o suprafata terestra a fost vizitata, i se va modifica valoarea din 1
in 2.
 Pentru a cauta daca suprafetei a[x][y] ii este vecina o suprafata terestra
o In N apelam subprogramul cu parametrii x si y+1 ;
o In E apelam subprogramul cu parametrii x+1 si y ;
o In S apelam subprogramul cu parametrii x si y-1 ;
o In V apelam subprogramul cu parametrii x-1 si y ;
 Aceasta problema poate fi considerata o aplicatie a conexitatii grafurilor, insulele
fiind « componente conexe » ale arhipelagului.
Program  :

P
#include <iostream> void df(int x, int y)
#include <fstream> {
using namespace std; a[x][y]=2;
int a[100][100],n, i, j, if(a[x-1][y]==1)
s[100], nr=0; df(x-1, y);
ifstream f("date.in"); if(a[x+1][y]==1)
df(x+1, y);
void citire(int n) if(a[x][y-1]==1)
{ df(x, y-1);
while(!f.eof()) if(a[x][y+1]==1)
for(i=1; i<=n; i++) df(x, y+1);
for(j=1; j<=n; j+ }
+)
{ main()
f>>a[i][j]; {
}} f>>n;
citire(n);
void afisare(int n) afisare(n);
{ for(i=1; i<=n; i++)
for(i=1; i<=n; i++) for(j=1; j<=n; j++)
{for(j=1; j<=n; {
j++) if(a[i][j]==1)
cout<<a[i] {nr++; df(i, j);}
[j]<<" "; }
cout<<endl;} cout<<"numarul de
insule este "<<nr;
}
f.close();
}
Date de test  :

1 1 0 1 0 1
0 1 0 1 1

( )
0 0 0 0 1 1

( 0
0
1
1
1
1
0
0
0
0
0
0
1
1
0
1
0

0
1
)
0 ===> 4 insule
1
0
0
1
1
0
1
0
1
0
0
1
1
1
0
1
0
1
0
0
0
0
0
1
==> 9 insule

0 0 0 0 0 1 1 1 1 1

( 0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0

0
0
)
0 ==> 0 insule
( 1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1

)
1 ==> o insula
1
1

S-ar putea să vă placă și