Consideraii teoretice
Algoritmul FILL realizeaz umple-rea (colorarea) unei suprafee nchise. Considerm o matrice ale crei ele-mente 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 ca-re se poate ajunge
mergnd un nu-mr 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
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 ntro 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
Dac privim matricea ca fiind re-prezentarea unui graf neorientat n care nodurile sunt reprezentate de celulele matricei, iar
muchiile sunt reprezentate de perechi de celule adi-acente de valoare 0, algoritmul FILL reprezint o particularizare a opraiei de
parcurgere n adncime a grafuri-lor (DF).
n figura anterioar este prezentat succesiunea acestor apeluri pen-tru un caz particular, n situaia n care ordinea apelurilor
recursive co-respunde 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
K1
AXY 2
ST1K X
ST2K Y
ct timp K > 0 execut
continu adevrat
X ST1K
Y ST2K
ct timp continu
execut
continu fals
dac X > 1 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 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
Aplicaii
Labirint
Un labirint este codificat printr-o matrice binar cu N l inii i M coloane. Considerm c singura ieire din labirint este celula
de coordonate (N,M). 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.
Bil
Se consider o matrice A cu N l inii 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 co-ordonate ale celulelor din care bila nu poate ajunge la margine.
Soluie
Prezentm n continuare soluia n pseudocod. Este utilizat o matrice auxiliar B ale crei elemente
sunt valori logice.
subalgoritm fill(L, C)
dac nu BLC atunci
BLC adevrat
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
// iniializarea matricei B
pentru I 1, N execut
pentru J 1, M execut
BIJ fals
sfrit pentru
sfrit pentru
Restricie:
1 N, M 100.
Exemplu:
N=4M=4
1
9
5
1
6
6
4
9
9 3
2 3
9 4
8 4
Rspuns corect:
2 3
3 2
// "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
dac nu BIJ atunci
scrie I, J
sfrit dac
sfrit pentru
sfrit pentru
sfrit algoritm
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.
Exemplu:
Trebuie menionat faptul c n nici una dintre cazematele de pe cmpul de lupt nu pot intra
mai multe detaamente.
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 fi- ierul output.txt, pe trei
linii. Fie-care linie va corespunde uneia dintre cele trei cerine.
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
FOTO - http://campion.edu.ro/arhiva/index.php?page=problem&action=view&id=1574
Alina este pasionat de fotografiile alb-negru. Ea ales o imagine pe care a codificat-o binar ntr-o matrice de dimensiune nxm cu valori
0 corespunztoare pentru alb (pe care le-a numit puncte luminoase) i cu valori 1 corespunztoare pentru negru (pe care le-a numit
puncte ntunecate). Astfel, ea identific n imaginea codificat zone luminoase i zone ntunecate, o zon fiind o poriune a matricei
care conine elemente cu aceeai valoare, trecerea de la un element la altul al zonei fcndu-se doar prin deplasri pe orizontal sau pe
vertical.
Cerin: Ajutai-o pe Alina s gseasc cea mai luminoas zon i determinai numrul de puncte luminoase ale acesteia.
Date de intrare
Pe prima linie a fiierului text foto.in se gsesc dou numere naturale n i m care reprezint numrul liniilor, respectiv numrul
coloanelor matricei. Pe urmtoarele n linii se gsesc cte m valori binare, separate prin cte un spaiu, reprezentnd elementele
matricei care codific imaginea.
Date de ieire
Fiierul text foto.out trebuie s conin o singur linie pe care se va afla numrul punctelor din cea mai luminoas zon a imaginii.
Restricii
1 n 100, 1 m 100, numere naturale
Dac nu exist nicio zon luminoas, se va considera c cea mai luminoas zon are 0 elemente
Exemple
foto.in
66
100111
110101
100100
111011
100110
100111
foto.out
5
Explicaii
Zona cea mai luminoas este format din elementele: (1,2),(1,3),(2,3),(3,2),(3,3)
Vila
Un senator are o vila, reprezentata printr-o matrice ce contine numai caracterele "1" si "-" (minus), unde 1 reprezinta "zid", iar 0
"spatiu liber". Spre exemplu o vila modesta, cu doar 3 camere arata in felul urmator:
1111111111111
1-------1---1
1---111111111
1-------1---1
1111111111111
Cerin:
a) Cate camere are vila senatorului
b) Care este camera cu suprafata cea mai mare
c) Ce perete trebuie indepartat (prin perete se intelege un singur caracter de '1') astfel incat sa se obtina o cea mai mare camera.
(se cere o singura solutie).
Datele de intrare se citesc din fisierul "vila.in" ce are urmatorul format:
- pe prima linie se gasesc doua numere naturale n si m despartite printr-un spatiu (1<=n,m<=100), care reprezinta numarul de
linii (n), respectiv numarul de coloane (m) al matricii
- pe urmatoarele n linii se gasesc cate m caractere "1" sau "-"
Datele de iesire se scriu in fisierul "vila.out", in urmatorul format
- prima linie contine numarul de camere
- a doua linie contine aria camerei de suprafata maxima
- a treia linie contine coordonatele zidului eliminat si aria camerei de suprafata maxima rezultata
Exemplu:
vila.in
5 13
1111111111111
1-------1---1
1---1111-1111
1-------1---1
1111111111111
vila.in
4 12
111111111111
-----11---------11----111111111111
vila.out
4
17
4 9 22
vila.out
2
10
1 1 11
Observatie:
Camerele nu se invecineaza pe diagonala.
Observatie:
Vila se considera inconjurata de ziduri
Imagine 1
r m m g g g a a
m v v g g g a a
m v v g v v v v
v v v r v v v v
v v r r r g g a
v v r r r g g g
a a a a a a a g
Dndu-se dimensiunile fermei i pentru fiecare celul culoarea corespunztoare culturii semnate, determinai:
Varianta 1: Suprafaa maxim a unei parcele n planul iniial.
Varianta 2: Numrul liniei, respectiv al coloanei celulei pe care va semna o alt cultur i culoarea corespunztoare noii culturi.
Date de intrare
Fiierul de intrare ferma.in va conine:
pe a doua linie dou numere naturale m i n separate printr-un spaiu, cu semnificaia din enun;
pe fiecare dintre urmtoarele m linii se gsesc cte n caractere (litere mici), reprezentnd codurile culturilor ce vor fi
semnate pe cele n celule corespunztoare fiecrei linii.
Date de ieire
Fiierul de ieire ferma.out va conine: Varianta 1
pentru v=1:
pe prima linie numrul natural s, reprezentnd suprafaa maxim a unei parcele;
Varianta 2 pentru v=2:
pe prima linie dou numere naturale separate printr-un spaiu, reprezentnd numrul liniei, respectiv al coloanei celulei pe
care va semna o alt cultur n vederea obinerii unei parcele cu suprafaa maxim;
pe a doua linie un caracter reprezentnd codul culorii corespunztoare noii culturi din celula determinat.
Restricii i precizri
2 m 400
2 n 400
Numrul de culturi distincte este cel puin 2 i cel mult 26.
30% din teste vor avea pe prima linie valoarea 1, iar restul de 70% din teste
vor avea pe prima linie valoarea 2.
Exemplu
ferma.in
1
78
rmmgggaa
mvvgggaa
mvvgvvvv
vvvrvvvv
vvrrrgga
vvrrrggg
aaaaaaag
2
78
rmmgggaa
mvvgggaa
mvvgvvvv
vvvrvvvv
vvrrrgga
vvrrrggg
aaaaaaag
ferma.out
11
Explicaii
Imagine 2
1
9 11
10 10 10 10 10 10 10
34
v
Pentru varianta 2:
Schimbnd n verde culoarea celulei din linia3, coloana 4 se obine o parcel
cu suprafaa 11+8+1=20.
111
1111
1111
1111111110
1000000010
1011101010
1010101010
1011101010
1000000010
1111111110
fig. 5
fig. 1
fig. 2
fig. 3
fig. 4
Cerin
S se determine numrul total de zone dreptunghiulare din matrice, ordinul maxim al unei zone i numrul de zone care au acest
ordin maxim.
Date de intrare
Fiierul de intrare dreptunghiuri.in conine pe prima linie numerele naturale L i C separate printr-un spaiu. Pe fiecare din
urmtoarele L linii din fiier se afl cte C numere din mulimea {0,1}, separate prin cte un spaiu, reprezentnd valorile din
matrice.
Date de ieire
Fiierul de ieire dreptunghiuri.out conine pe prima linie trei numere naturale D, O i NR, separate prin cte un spaiu, unde D
este numrul total de zone dreptunghiulare din matrice, O este ordinul maxim al unui astfel de zone, iar NR este numrul de zone
de ordin maxim.
Restricii i precizri
3 L, C 1 000
Datele de intrare sunt corecte. Va exista cel puin o zon dreptunghiular n matrice.
Pentru determinarea corect a numrului de zone se acord 20% din punctajul pe fiecare test.
Exemplu
dreptunghiuri.in
dreptunghiuri.out
Explicaii
9
12
431
Sunt n total 4 zone dreptunghiulare, ordinul maxim al uneia
011111111111
dintre ele este 3 (cea format dintr-un singur 1) i este o singur
astfel de zon.
010000000001
010111110001
010100010101
010101010101
010100010101
010111110101
010000000001
011111111111
Timp maxim de execuie/test: 0.6 secunde (Linux) ; 0.8 secunde (Windows)
Memorie total disponibil: 16 MB, din care 1 MB pentru stiv
insule.out
Explicaie
6 7
1000320
0110313
3333000
2033000
2203011
2000010
4 2 3 4
ara R are 4 insule, ara G are 2 insule, iar ara B are 3 insule.
Lungimea minim a unui pod care poate fi construit este 4; de
exemplu, podul traverseaz celulele (6,5), (6,4), (6,3), (6,2).
explicaie
Dup cei 18 pai
de la plecare
ajunge n
punctul situat
n colul din
dreapta jos al
ptratului
unitate de
coordonate
parcuri delimiteaz
11 Ultimii
(3,4).
ptrate unitate. 16 pai
Cerin
Dat fiind harta digitizat a zonelor monitorizate, s se determine numrul zonelor de uscat afectate de un tsunami de nlime h.
Date de intrare
Fiierul de intrare tsunami.in conine pe prima linie trei numere naturale n,m i h separate prin cte un spaiu, reprezentnd
dimensiunile hrii, respectiv nlimea valului mareic. Pe urmtoarele n linii sunt scrise cte m numere naturale separate prin cte
un spaiu reprezentnd, n ordine, cotele din cele nm ptrate teritoriale unitate ale hrii.
Date de ieire
Fiierul de ieire tsunami.out conine o singur valoare ce reprezint numrul ptratelor unitate afectate de un tsunami de
nlime h.
Restricii i precizri
2 n,m 1000
1 h 10
Zona monitorizat nu conine lacuri interioare (ptrate unitate nvecinate, avnd cota 0, nconjurate complet de
ptrate unitate avnd cote strict mai mari dect 0)
Cotele sunt numere naturale 1000
Exemple
tsunami.in
6 7 3
0 0 4 2 5
1 0 0 7 3
2 3 0 5 2
0 7 5 4 0
0 5 2 3 0
0 4 4 8 0
0
6
2
0
2
2
0
0
0
0
0
0
tsunami.out
6
Explicaii
Zonele inundate sunt reprezentate ngroat n tabloul bidimensional:
0 0 4 2 5 0 0
1 0 0 7 3 6 0
2 3 0 5 2 2 0
0 7 5 4 0 0 0
0 5 2 3 0 2 0
0 4 4 8 0 2 0