Sunteți pe pagina 1din 2

Ministerul Educaiei Cercetrii i Tineretului

Olimpiada Judeean de Informatic


15 martie 2008

Clasa a Xa

Descrierea soluiei problemei 1 colaj


Propuntor: prof Carmen MINC
Se consider urmtorul exemplu
colaj.in

colaj.out
5

7
25 15
1 1 16 5
14 4 21 12
4 7 15 8
19 6 25 9
2 10 23 14
5 2 6 11
8 3 12 13

Explicaie
Colajul realizat de echipa A
este cel din desenul alturat.
Se observ 5 suprafee albe
distincte coninute de colaj.

O soluie se poate obine pe baza metodei mpririi n zone elementare, care nu se intersecteaz cu nici un
dreptunghi. Pentru exemplul dat, se obine urmtoarea mprire n zone elementare:
Sunt reprezentate i vrfurile planei: (0; 0), (25;0),
(0, 15) i (25; 15). Se observ c aceste zone elementare
formeaz o matrice A avnd un numr de linii, respectiv
coloane, din mulimea {2n-1, 2n, 2n+1}.
Numrul minim de linii 2n-1, respectiv coloane: 2n-1, se
obine dac exist dreptunghiuri cu laturile pe marginile de
jos i sus, respectiv din stnga i dreapta, ale planei.
Numrul de linii, respectiv coloane,crete cu 1 dac niciun
dreptunghi nu este situat pe marginea de jos, respectiv din
stnga, a planei.
Numrul de linii, respectiv coloane, crete cu 1 dac niciun dreptunghi nu este situat pe marginea de sus,
respectiv din dreapta, a planei.
Fie x0, respectiv y0, valoarea care se adaug la 2n-1 pentru a se obine numrul de coloane, respectiv linii,
ale matricei A. Pentru matricea din exemplu, x0=1, y0=2.

0
0
0
0
0
0
0
0
0
0
0
0
0
0
0

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

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

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

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

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

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

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

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

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

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

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

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

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

Elementul A[i][j] al matricei va avea


valoarea 1 dac i numai dac exist cel puin
un dreptunghi care s conin zona elementar
respectiv.
Matricea este inversat fa de axa Ox.
Pentru exemplul dat, matricea A are 2n+1
linii i 2n coloane, iar coninutul ei este cel
alturat.
Pentru construcia matricei vom folosi doi
vectori X i Y. Vectorul X va reine toate
abscisele vrfurilor dreptunghiurilor. Vectorul Y
va
reine
toate
ordonatele
vrfurilor
dreptunghiurilor.

Zonele elementare din desen corespund cte unui element A[i][j] din matrice i sunt dreptunghiuri care au
coordonatele vrfurilor opuse: (X[i],Y[j]) i (X[i+1],Y[j+1]) i,j=1,2,,2n.

Ministerul Educaiei Cercetrii i Tineretului


Olimpiada Judeean de Informatic
15 martie 2008

Clasa a Xa

Dac nu exist dreptunghiuri incluse n interiorul unui alt dreptunghi, atunci vectorii au cte 2n componente,
fiecare avnd toate valorile distincte. Altfel sunt memorate coordonatele dreptunghiurilor care un sunt incluse ntrun alt dreptunghi.
Se sorteaz cresctor vectorii. Pentru exemplul dat, vectorii vor avea coninutul:
X=(1,2,4,5,6,8,12,14,15,16,19,21,23)
Y=(1,2,3,4,5,6,7,8,9,10,11,12,13,14)
Se memoreaz coordonatele vrfurilor dreptunghiurilor din exemplul dat ntr-un vector V cu n elemente de
tip structur:
struct dr { int a,b,c,d; int pa,pb,pc,pd;};
unde:
1. (a,b) sunt coordonatele vrfului stnga-jos al dreptunghiului
2. (c,d) sunt coordonatele vrfului dreapta-sus al dreptunghiului
3. pa este poziia pe care apare a n vectorul sortat X
4. pb este poziia pe care apare b n vectorul sortat Y
5. pc este poziia pe care apare c n vectorul sortat X
6. pd este poziia pe care apare d n vectorul sortat Y
Se iniializeaz matricea A cu 0. Pentru fiecare dreptunghi, se marcheaz cu 1 toate zonele acoperite de acesta:
for(k=1;k<=n;k++)
for(j=v[k].pa;j<v[k].pc;j++)
for(i=v[k].pb;i<v[k].pd ;i++)a[i+y0][j+x0]=1;
Se bordeaz matricea cu 1, pentru a nu iei n exteriorul ei n timpul aplicrii algoritmului FILL. Se caut fiecare
element din matrice cu valoarea 0, se umple att elementul ct i vecinii acestuia cu valoarea 1 i se numr zonele
care au valoarea 0. Acest numr va fi numrul de suprafee albe din colaj.
Dup aplicarea FILL-ului matricea A din exemplu va avea toate valorile egale cu 1.
Sursele colajC.cpp i colajP.pas constituie implementarea a acestei soluii.
O solutie care obine un puntaj parial const n a contrui o matrice A cu p linii i m coloane, elementele ei
memornd valori 0 i 1.
Fiecrui dreptunghi cu vrful stnga-jos, respectiv dreapta-sus, de coordonate (xa,ya), respectiv (xb,yb), i
corespunde n matricea A o zon n care toate elementele au valoarea 1:
for(l=ya;l<yb;l++)
for(c=xa;c<xb;c++) a[l][c]=1;
Pornind de la primul element din matrice cu valoarea 0, aplicnd algoritmului FILL, umplem att elementul
ct i vecinii acestuia cu valoarea 1 i numrm zonele care au valoarea 0. Acest numr nr va fi numrul de
suprafee albe din colaj.
Dezavantajul utilizrii acestei metode const n spaiul de memorie disponibil, insuficient pentru memorarea
matricei A. Nu ntotdeauna este posibil memorarea unei matrice cu mxp( m,p<8000) i cu elemente de tip
char/byte. Prin comprimarea dreptunghiurilor utiliznd metoda mpririi n zone elementare, se reduce spaiul
necesar memorrii matricei de tip char la cel mult 201x201 octeti.
Un alt dezavantaj rezult din timpul mare de executare, datorat aplicrii algoritmului recursiv FILL pentru o
matrice cu un numr mare de componente, i a dimensiunii mici a memoriei corespunztoare segmentului de stiv.
(vezi sursa colaj_40.cpp care obine 40p).
O mbuntire a punctajului se poate obine atunci cnd valorile m i p permit declararea unei matrice A de
tip char care s memoreze toate zonele corespunztoare dreptunghiurilor, prin eliminarea anumitor linii i coloane.

Necesitnd un numr mare de operaii datorate tergerilor liniilor, respectiv coloanelor, identice din A se
depete timpul de execuie.
Se elimin anumite linii ale matricei A astfel: dac liniile l i,li+1,....,lk din A sunt identice, reinem linia l i,
restul fiind terse, nefiind necesare, realizndu-se astfel o comprimare pe linii a matricei A, fiecare grup de linii
identice fiind inlocuit cu o singur linie de acest tip.
Analog, dac coloanele ci,ci+1,....,ck din A sunt identice, atunci se pstreaz n A doar coloana c i, restul se
terg nefiind necesare, realiznd astfel o comprimare pe coloane a matricei A, pentru fiecare grup de coloane
identice pstrndu-se n A o singur coloan de acest tip. (vezi sursa colaj_50.cpp care obine 50p).

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