You are on page 1of 3

Programare dinamic

focus

FILL.
TEORIE i APLICAII
Algoritmul

Radu Viinescu, Violeta Viinescu


Articolul prezint aspectele teoretice, cu implemetri recursive i iterative ale
algoritmului FILL, urmate de o serie de aplicaii i adaptri n probleme de
concurs.
Algoritmul FILL este privit cu indulgent de muli programatori, fiind considerat un caz banal. Este adevrat, dar utilizarea sa presupune
atunci stpnirea mecanismului recursivitii.
Pe de alt parte, considerm c
acest algoritm este sugestiv n ceea ce
privesc aspectele lui teoretice si legturile sale cu tehnica backtracking i
cu parcurgerea n adncime a unui
graf.

Consideraii teoretice

AXY 2
fill(X, Y + 1)
fill(X + 1, Y)
fill(X, Y - 1)
fill(X - 1, Y)
sfrit dac
sfrit algoritm

Putem prezenta acelai algoritm


ntr-o form care pune n eviden

caracterul de backtracking al acestuia:


DX (0, 1, 0, -1)
DY (1, 0, -1, 0)
algoritm fill2(X, Y)
dac AXY = 0 atunci
AXY 2
pentru I 1, 4 execut
fill2(X + DXI, Y + DYI)
sfrit pentru
sfrit dac
sfrit algoritm
GInfo nr. 15/3 - martie 2005

Algoritmul FILL realizeaz umplerea (colorarea) unei suprafee nchise.


Considerm o matrice ale crei elemente pot avea una dintre valorile 1
i 0 cu semnificaia: 1 reprezint un
perete, iar 0 o zon liber.
Pornind dintr-o zon de valoare
0, algoritmul trebuie s coloreze cu
valoarea 2 toate celelalte celule n care se poate ajunge mergnd un numr finit de pai pe direciile: sus,
jos, stnga, dreapta.
Pentru simplitate, considerm c
matricea este bordat cu elemente a
cror valoare este 1.
Algoritmul recursiv este urmtorul:

algoritm fill(X, Y)
dac AXY = 0 atunci

35

focus

Dac privim matricea ca fiind reprezentarea unui graf neorientat n


care nodurile sunt reprezentate de
celulele matricei, iar muchiile sunt
reprezentate de perechi de celule adiacente de valoare 0, algoritmul FILL
reprezint o particularizare a opraiei
de parcurgere n adncime a grafurilor (DF).
n figura anterioar este prezentat succesiunea acestor apeluri pentru un caz particular, n situaia n
care ordinea apelurilor recursive corespunde direciilor est, sud, vest,
nord.
n cursul executrii algoritmului
prin fiecare celul a matricei se trece
o singur dat (un singur apel). Din
acest motiv, dei se comport ca un
algoritm de cutare cu revenire (backtracking), ordinul de complexitate al
algoritmului este O(N M), unde N
i M reprezint dimensiunile matricei.
Ordinul de complexitate este polinomial, spre deosebire de majoritatea cazurilor n care este utilizat tehnica backtracking.
Prezentm acum o variant iterativ de implementare a acestui algoritm.
algoritm fill_iterativ(X,Y)
dac AXY = 0 atunci

GInfo nr. 15/3 - martie 2005

K1
AXY 2
ST1K X
ST2K Y

36

ct timp K > 0 execut


continu adevrat
X ST1K
Y ST2K
ct timp continu
execut
continu fals

KK+1
ST1K ST1,K-1 - 1
ST2K ST2,K-1
sfrit dac
dac X < N i AX+1,Y = 0
i nu continu
atunci
continu adevrat
AX+1,Y 2
KK+1
ST1K ST1,K-1 + 1
ST2K ST2,K-1
sfrit dac
dac Y > 1 i AX,Y-1 = 0
i nu continu
atunci
continu adevrat
AX,Y-1 2
KK+1
ST1K ST1,K-1
ST2K ST2,K-1 - 1
sfrit dac
dac Y < M i AX,Y+1 = 0
i nu continu
atunci
continu adevrat
AX,Y+1 2
KK+1
ST1K ST1,K-1
ST2K ST2,K-1 + 1
sfrit dac
sfrit ct timp
KK-1
sfrit ct timp
sfrit dac
sfrit algoritm

Aplicaii
Exist o serie de probleme care pot fi
privite drept aplicaii i adaptri ale
algoritmului FILL.
Prezentm n continuare patru
astfel de probleme.

Fiind dat o celul oarecare din


labirint, ale crei coordonate sunt
(X, Y), s se determine un drum de
la aceasta i pn la ieirea din labirint. Nu este neaprat necesar ca
drumul determinat s aib lungimea
minim.
Fotografie
O fotografie alb-negru este codificat printr-o matrice binar cu N linii
i M coloane.
Un obiect este format din elemente cu valoarea 1 care se nvecineaz pe linii, pe coloane sau pe diagonale.
Determinai numrul de obiecte
din fotografie.
Bil
Se consider o matrice A cu N linii i
M coloane ale crei elemente sunt
numere naturale. Elementele acestei
matrice reprezint nlimile unor
zone.
O bil pornete dintr-o celul a
matricii i se poate deplasa la fiecare
pas n celulele nvecinate pe orizontal sau vertical dac i numai dac
celula destinaie are o nalime mai
mic sau egal dect cea din care a
plecat.
Astfel, dup un anumit numr de
pai, bila poate ajunge pe o margine
a matricei.
S se determine perechile de coordonate ale celulelor din care bila
nu poate ajunge la margine.
Restricie:
1 N, M 100.
Exemplu:
N=4M=4
1
9
5
1

6
6
4
9

9
2
9
8

3
3
4
4

Rspuns corect:
dac X > 1 i AX-1,Y = 0
i nu continu
atunci
continu adevrat
AX-1,Y 2

Labirint
Un labirint este codificat printr-o matrice binar cu N linii i M coloane.
Considerm c singura ieire din
labirint este celula de coordonate (N,
M).

2 3
3 2

Aceast problem a fost propus


spre rezolvare elevilor de clasa a
VIII-a la ediia 2005 a Olimpiadei

Locale de Informatic din judeul


Prahova.
Soluie
Prezentm n continuare soluia n
pseudocod. Este utilizat o matrice
auxiliar B ale crei elemente sunt
valori logice.

dac L < N i AL+1,C ALC


atunci
fill(L + 1, C)
sfrit dac
dac L > 1 i AL-1,C ALC
atunci
fill(L - 1, C)
sfrit dac
dac C < M i AL,C+1 ALC
atunci
fill(L, C + 1)
sfrit dac
dac C > 1 i AL,C-1 ALC
atunci
fill(L, C - 1)
sfrit dac
sfrit dac
sfrit subalgoritm
algoritm bila

// "umplerea" matricei B
pentru toate celulele (L, C) de

pe marginea matricei B
i nu BLC execut
fill(L, C)
sfrit pentru
// afiarea rezultatelor
pentru I 1, N execut
pentru J 1, M execut

sfrit algoritm

Ordinul de complexitate al acestui algoritm este O(N M).


Operaiune militar
Pentru a evita atacurile teroritilor,
forele armate implicate n conflictul
din Kari au hotrt s se retrag n
cazematele construite pe terenul de
lupt, codificat printr-o matrice binar cu N linii i M coloane, n care
valoarea 1 reprezint un perete, iar
valoarea 0 reprezint spaiu liber.
Cazematele sunt zonele de pe teren
care sunt n ntregime nconjurate de
perei.
Va trebui s scriei un program
care, pe baza configraiei terenului
de lupt, determin:
numrul cazematelor de pe terenul
de lupt;
numrul soldailor care se pot adposti n cazemate, considernd c
fiecare soldat ocup, n caz de necesitate, o singur locaie din matrice, care nu este perete i care se
afl n interiorul cazematei;
cunoscndu-se numrul K al detaamentelor i numrul soldailor
din fiecare detaament, trebuie determinat, dac este posibil, o distribuie a soldailor, astfel nct detaamentele s nu se scindeze;
n cazul n care acest lucru nu
este posibil, se va afia mesajul
imposibil;
dac exist o astfel de posibilitate, atunci, pentru fiecare detaament, se va afia un triplet de
forma: numrul de ordine al detaamentului, linia i coloana
unei poziii libere din cazemat
n care se vor distribui soldaii
acelui detaament.
Trebuie menionat faptul c n
nici una dintre cazematele de pe

Datele de intrare se citesc din fiierul input.txt, astfel:


pe prima linie se afl numerele N,
M i K, separate prin cte un spaiu;
pe urmtoarele N linii se afl matricea binar, cu elementele separate prin cte un spaiu;
pe ultima linie se afl K numere,
separate prin cte un spaiu, corespunztoare numrului de soldai
din fiecare detaament.
Datele de ieire se vor afia n fiierul output.txt, pe trei linii. Fiecare linie va corespunde uneia dintre
cele trei cerine.
Exemplu:
input.txt
4 5 3
0 0 0 0 0
0 1 1 0 0
1 0 0 1 0
0 1 1 1 0
2 3 1
output.txt
1
2
Imposibil

Aceast problem, ntr-o form


puin diferit, a fost propus spre
rezolvare elevilor de clasa a X-a la
ediia 2005 a Olimpiadei Locale de
Informatic din judeul Prahova.

ncheiere
Ne exprimm sperana c acest articol se va dovedi util pentru clarificarea mecanismului algoritmului FILL.
De asemenea, propunem cititorilui rezolvarea aplicaiilor enunate
n cadrul acestui articol.

Bibliografie
1. Radu Viinescu, Bazele programrii - prin exerciii i probleme - ,
Editura Petrion, 2002;
2. ***, probleme propuse la concursurile de programare.

GInfo nr. 15/3 - martie 2005

// iniializarea matricei B
pentru I 1, N execut
pentru J 1, M execut
BIJ fals
sfrit pentru
sfrit pentru

sfrit pentru
sfrit pentru

cmpul de lupt nu pot intra mai


multe detaamente.

focus

subalgoritm fill(L, C)
dac nu BLC atunci
BLC adevrat

dac nu BIJ atunci


scrie I, J
sfrit dac

37

You might also like