Sunteți pe pagina 1din 40

Tablouri

bidimensionale

! Defini!ie
! Opera!ii cu tablouri bidimensionale
! Careuri magice
! Implement"ri sugerate
! Probleme propuse
! Solu!iile problemelor
Capitolul
12


Am v!zut c! ntr-un tablou unidimensional se pot p!stra mai multe valori de acela"i
tip. Fie, de exemplu, mediile generale ale tuturor elevilor unei clase. Toate mediile
(numere reale) se denumesc cu acela"i identificator, de exemplu MedGen, iar un ele-
ment n aceast! grupare se g!se"te pe baza pozi#iei ocupate n grupul de valori, aranja-
te liniar. Dac! privim "irul numelor, acestea, la rndul lor formeaz! un alt "ir, n care
fiecare element este un "ir de caractere.

Exemplu
Pozi#ie 1 2 ... 30
MedGen
Valoare 9.33 8.20 ... 9.63

Pozi#ie 1 2 ... 30
Nume
Valoare Albu Ban ... Zeciu

Corespunz!tor acestui exemplu ne puteam referi la nota unui elev prin MedGen[nr],
unde nr este num!rul de ordine din catalog al elevului respectiv. Aceast! valoare este
indicele elementului n "ir.
Ne propunem s! referim toate mediile pe discipline ale fiec!rui elev printr-o singu-
r! variabil!. Conform catalogului (cunoscut din "coal!) avem urm!toarele date:

1 (Limba romn!) 2 (Matematic!) ... 12 (Educa#ie fizic!
1 Albu 7.33 9.20 ... 10
2 Ban 6.67 7.33 ... 10
... ... ... ... ... ...
30 Zeciu 9.10 ... ... 10
240 12. Tablouri bidimensionale

Mediile tuturor elevilor unei clase la toate disciplinele studiate pot fi p!strate ntr-o
singur! structur! de date n care valorile sunt aranjate liniar pe linii "i coloane (o linie
corespunde unui elev, o coloan! corespunde unei discipline studiate). n exemplul de
mai sus, linia 2 corespunde elevului Ban, n coloana 12 sunt scrise mediile la educa#ie
fizic!.

Tabloul bidimensional este o structur! de date n care fiec!rui element i este asoci-
at! o pereche de indici, primul preciznd num!rul de ordine al liniei n care se afl! ele-
mentul, iar cel de-al doilea num!rul de ordine al coloanei. Media aflat! pe linia i "i
coloana j se va nota cu Medie[i, j] "i reprezint! media elevului i la disciplina j. Oric!-
rui tablou bidimensional i se aloc! spa#iu de memorie ntr-o zon! continu! de memo-
rie, elementele aflndu-se n loca#ii succesive de memorie a"ezate linie dup! linie.

Exemplu
Un tablou bidimensional avnd trei linii "i patru coloane se va reprezenta n memo-
rie astfel:




Linia 1 Linia 2 Linia 3

Vom da defini#ia tabloului bidimensional
*)
, n caz general:

12.1. Defini!ie
Fie M = {1, 2, ..., m} "i N = {1, 2, , n} mul#imea primelor m, respectiv n numere na-
turale nenule. Consider!m o mul#ime de elemente E ale c!ror tip de baz! este T.
Se nume"te tablou bidimensional de dimensiune m ! n, avnd elemente de tipul T,
o func#ie A: M ! N $ E.
Not!m elementele cu a
ij
, unde i " M, j " N. Aceste elemente sunt aranjate pe m
linii "i n coloane, astfel nct acele elemente care au indicele de linie i, sunt plasate pe
aceea"i linie i, iar cele avnd acela"i indice de coloan! j, pe aceea"i coloan! j:

A =
#
#
#
#
$
%
&
&
&
&
'
(
mn m m
n
n
a a a
a a a
a a a
...
...
...
...
2 1
2 22 21
1 21 11
... ... ...


*)
No#iunea de tablou bidimensional deriv! din no#iunea de matrice (cunoscut! din matematic!).
12. Tablouri bidimensionale 241

Cazuri particulare
1) Dac! n = 1, avem un tablou de dimensiuni m ! 1 care se nume"te tablou coloan! "i
este de forma:
A =
#
#
#
#
$
%
&
&
&
&
'
(
1
21
11
...
m
a
a
a

2) Dac! m = 1, tabloul de dimensiune 1 ! n se nume"te tablou linie "i este de forma:
A = (a
11
, a
12
, , a
1n
)

3) Dac! m = n, avem un tablou de dimensiune n ! n, numit tablou p!tratic.

Exemplu
Fie un tablou p!tratic de dimensiune 6 (m = n = 6).
i = j i < j
a
11
a
12
a
13
a
14
a
15
a
16
a
21
a
22
a
23
a
24
a
25
a
26
a
31
a
32
a
33
a
34
a
35
a
36
a
41
a
42
a
43
a
44
a
45
a
46
a
51
a
52
a
53
a
54
a
55
a
56
a
61

i > j

a
62
a
63
a
64
a
65
a
66

) Elementele n cazul c!rora indicele de linie coincide cu indicele de coloan! (a
11
,
a
22
, ..., a
nn
) formeaz! diagonala principal! a tabloului.
) Paralelele la diagonala principal! a tabloului vor atinge acele elemente n cazul c!-
rora i = j + k, unde n + 1 < k < n 1. Pentru fiecare valoare a lui k, variind j, ob#i-
nem o paralel! la diagonala principal!.
) Elementele de deasupra diagonalei principale satisfac proprietatea i < j, iar cele
care se situeaz! sub diagonala principal! au proprietatea c! indicii lor satisfac rela-
#ia i > j.
242 12. Tablouri bidimensionale

) n mod similar, "irul de elemente a
1,n
, a
2,n-1
, ..., a
n,1
formeaz! diagonala secundar!
a tabloului. n cazul acestora, indicii elementelor respect! rela#ia i + j = n + 1.
) n cazul elementelor aflate deasupra diagonalei secundare indicii au proprietatea
i + j < n + 1, iar cele care se afl! sub diagonala principal! au indici cu proprietatea
i + j > n + 1.

Observ!m c! pentru a parcurge doar elementele de sub diagonala principal!, indicii
de linie "i de coloan! variaz! astfel nct s! acopere un triunghi dreptunghic din
tablou. Acest triunghi are ipotenuza sub diagonala principal! "i cele dou! catete sunt
coloana 1 "i linia n. n concluzie, la acest triunghi de pe linia i vor participa elementele
de pe coloanele 1, 2, ..., i 1.

12.2. Opera!ii cu tablouri bidimensionale
n algoritmi vom prelucra tablouri bidimensionale n cele mai variate moduri. Vom
face distinc#ie ntre opera#ii care acceseaz! tabloul ca pe un ntreg "i opera#ii care
acceseaz! elementele tabloului. Dar nainte de toate un tablou trebuie declarat.

12.2.1. Declararea tablourilor bidimensionale
Declara"ia are urm!toarea form! general!:

type TipTab=array[tip_indice
1
, tip_indice
2
] of tip_de_baz!;
var tablou:TipTab;

unde prin tip_indice
1
, tip_indice
2
se n#elege tipul valorilor din care se alimenteaz! in-
dicii (este obligatoriu un tip ordinal), iar tip_de_baz! este tipul elementelor tabloului.
Acest tip de baz! poate fi orice: putem avea elemente de orice tip numeric, de caracte-
re sau "iruri de caractere, valori booleene, nregistr!ri (vezi tipul record), tablouri de
cele mai diverse tipuri etc.
tip_indice
1
, tip_indice
2
pot fi identificatori de tip predefinit sau definit de utilizator
"i, de asemenea, pot fi expresii, cu men#iunea c! n acestea pot interveni doar constan-
te "i constante simbolice:

Exemplu
const n=5;
var TipTablou=array[1..2*n,1..n] of Byte;
Numere=array[Boolean,Byte] of Integer;

Dac! structura unui tablou este descris! n sec#iunea var, atunci el va avea un tip
anonim. Asociind tipului respectiv un identificator de tip ntr-o declara#ie type, acesta
va putea fi folosit n program, oriunde vrem s! referim acest tip.
12. Tablouri bidimensionale 243

Reamintim c! dou! tablouri declarate n dou! declara"ii anonime diferite vor fi de
tipuri diferite, chiar dac! n ele s-a descris aceea#i structur!.

Exemplu
type TipTablou=array[1..10,1..5] of Byte;
var x,y:TipTablou;
a:array[1..10,1..5] of Byte;
b,c:array[1..10,1..5] of Byte;

n programul care con#ine aceste declara#ii, tablourile x "i y vor fi considerate de
acela"i tip (TipTablou), b "i c, de asemenea vor avea un tip comun (anonim), iar a va
fi de tip anonim diferit de TipTablou, respectiv de tipul anonim al lui b "i c.

12.2.2. Citirea tablourilor bidimensionale
n programe, de regul!, prima opera#ie va fi citirea unui astfel de tablou. n limbajele
Pascal "i C nu se poate citi o variabil! de tip tablou. Aceast! opera#ie se va realiza ele-
ment cu element.

Subalgoritm Citire(n,x):
cite!te m,n { tabloul x are m linii #i n coloane }
pentru i=1,m execut":
pentru j=1,n execut":
cite!te x[i,j]
sfr!it pentru
sfr!it pentru
sfr!it subalgoritm

12.2.3. Afi#area tablourilor bidimensionale
Afi"area tablourilor se realizeaz! asem!n!tor. Dac! dorim s! realiz!m o afi"are linie
dup! linie a tabloului x de tipul tablou, avnd m linii "i n coloane, n Pascal vom
scrie procedura n felul urm!tor:

procedure Afi!are(m,n:Byte; x:tablou);
begin
for i:=1 to m do begin
for j:=1 to n do
Write(x[i,j],' ');
WriteLn { trecem la linie nou! }
end
end;


244 12. Tablouri bidimensionale

12.2.4. Atribuirea
Atribuirea la nivel de tablou este permis! doar dac! identificatorii men#iona#i n partea
stng! "i cea dreapt! a opera#iei de atribuire au acela"i tip. De exemplu, conform de-
clara#iilor din exemplul men#ionat, x poate primi valoarea lui y, iar b poate lua valoa-
rea lui c. Putem scrie n program: x:=y; "i b:=c; dar nu putem scrie a:=b;

%innd cont de faptul c! n multe aplica#ii va fi necesar! efectuarea unor opera#ii cu
elementele tablourilor bidimensionale, asem!n!tor opera#iilor din teoria matricelor n
matematic!, vom prezenta cteva din aceste opera#ii.

12.2.5. Adunarea matricelor
Fie A "i B dou! matrice de dimensiune m ! n:
A = (a
ij
), 1 + i + m, 1 + j + n,
B = (b
ij
), 1 + i + m, 1 + j + n.
Definim matricea
C = (c
ij
), 1 + i + m, 1 + j + n,
ale c!rei elemente sunt date de egalit!#ile:
c
ij
= a
ij
+ b
ij
(*)
oricare ar fi i = 1, 2, , m, j = 1, 2, , n.
Matricea C se nume"te suma dintre matricele A "i B "i se noteaz!
C = A + B.
n program vom realiza adunarea element cu element, conform formulei (*).
Men#ion!m c! adunarea a dou! matrice este comutativ!: A + B = B + A "i este aso-
ciativ!: (A + B) + C = A + (B + C). Matricea element neutru fa#! de adunare se nume"-
te matrice nul! "i are toate elementele egale cu 0. Se va nota: 0
mn
.

O matrice format! din elementul 0, mai pu#in pe diagonala principal!, unde are nu-
mai valori egale cu 1, se nume"te matrice unitate "i se noteaz! cu I
n
.

12.2.6. Matricea opus"
Oricare ar fi matricea A, exist! o matrice notat! cu A astfel nct:
A + (A) = (A) + A = 0
mn

12.3. Careuri magice
Exist! o bogat! tradi#ie a p!tratelor magice. Referirile la primele p!trate magice se
pierd n negura timpurilor.

Defini!ie
Un careu de dimensiune n care con#ine numere de la 1 la n
2
se nume"te magic, dac!
suma numerelor de pe oricare linie a careului este egal! cu suma numerelor de pe ori-
12. Tablouri bidimensionale 245

care coloan! "i sunt egale cu suma numerelor aflate pe oricare dintre cele dou! diago-
nale. Aceast! valoare se nume"te sum! magic! "i se calculeaz! cu formula:
sum!_magic!(n) = n , (n
2
+ 1)/2.

Prezent!m trei algoritmi diferi#i pentru generarea p!tratelor magice, n func#ie de
proprietatea lui n:
a) n este impar;
b) n este multiplu de 4;
c) n este par dar nu este multiplu de 4.

12.3.1. P"tratul magic de ordin impar
n cartea lui Feng Shui (Arta vie"ii n armonie cu natura), precum "i n cartea lui Yi
Jing (Cartea schimb!rilor) autorii consider! c! p!tratul magic descoperit de Wu Hsia
a fost imaginat pe carapacea unei broa"te #estoase. Acest p!trat magic este atribuit ci-
viliza#iei chineze dintre anii 2858 2738 nainte de Christos:

8


2 9 4
6 1
7 5 3

Traseul ob#inut prin parcurgerea n ordine a numerelor din acest careu magic este
cunoscut sub numele de drumul mp!ratului Ven. Urm!rind acest traseu, putem
deduce modul de generare al oric!rui careu magic de ordin impar. Se observ! urm!-
toarele reguli:
) Pornim din pozi#ia avnd indicii 1 "i -n/2. (parte ntreag! superioar!).
) Dac! suntem pe prima linie, drumul continu! pe ultima linie "i pe coloana prece-
dent!, dac! exist! o astfel de coloan!.
) Dac! suntem pe prima coloan!, drumul continu! pe ultima coloan! "i pe linia pre-
cedent!, dac! exist! o astfel de linie.
) n rest ncerc!m s! avans!m pe diagonal! (paralel cu diagonala principal!) spre
stnga-sus, dac! avem pozi#ie liber! n careu n acea direc#ie. Cnd nu mai putem
avansa astfel, coborm cu o linie pe aceea"i coloan!.
246 12. Tablouri bidimensionale

Exemplu
n = 5, pa"ii 1, 2, 3, 4: pa"ii pn! la pasul 17:

12 2 12 12 15 8 1 17
10 16 14 7 5
1 4 13 6 4
3

3 12 10
20 9 2 11

12.3.2. P"tratul magic de ordin multiplu de 4
Pentru a genera un p!trat magic de ordin n (n multiplu de 4), se aplic! urm!torii pa"i:
) Se genereaz! p!tratul de dimensiune n n care a"ez!m numerele de la 1 la n
2
n or-
dine pe linii.
) Elementele aflate pe linii avnd num!r de ordine pentru care restul mp!r#irii la 4
este 0 sau 1 "i coloane care nu au aceast! proprietate, sau pe coloane avnd num!r
de ordine pentru care restul mp!r#irii la 4 este 0 sau 1 "i linii care nu au aceast!
proprietate, vor fi schimbate cu elementele aflate n pozi#ii simetrice fa#! de mijlo-
cul careului, a"a cum se poate observa din figura urm!toare:

1 2 3 4 5 6 7 8

1 63 62 4 5 59 58 8
9 10 11 12 13 14 15 16

56 10 11 53 52 14 15 49
17 18 19 20 21 22 23 24

48 18 19 45 44 22 23 41
25 26 27 28 29 30 31 32

25 39 38 28 29 35 34 32
33 34 35 36 37 38 39 40

33 31 30 36 37 27 26 40
41 42 43 44 45 46 47 48

24 42 43 21 20 46 47 17
49 50 51 52 53 54 55 56

16 50 51 13 12 54 55 9
57 58 59 60 61 62 63 64

57 7 6 60 61 3 2 64

12.3.3. P"trat magic de ordin n, unde n = 2 , m (m num"r impar)
Algoritmul de generare a unui p!trat magic de ordin n, unde n = 2 , m "i m este num!r
impar, este o metod! elegant!, ajuns! prima dat! n Europa prin Siam.
12. Tablouri bidimensionale 247

Acest algoritm se aplic! conform urm!torilor pa"i:
) Se calculeaz! valoarea lui m;
) Se genereaz! o matrice de litere (construc#ie ajut!toare) astfel:
primele [m / 2] +1 linii se completeaz! cu litera L;
linia urm!toare se completeaz! cu litera U;
restul liniilor se completeaz! cu litera X;
litera L aflat! n mijlocul careului se interschimb! cu litera U aflat! sub ea.

Exemplu
Dac! n = 10, avem m = 5.









) p!tratul magic de dimensiune 2,m se construie"te urm!rind algoritmul de generare
a p!tratelor magice impare, considernd p!tratul de dimensiune m (m este impar),
format din p!trate de dimensiune 2.
) Fiecare p!trat de dimensiune 2 ! 2 va avea ca "i corespondent o liter! L, U, sau
X "i va fi completat n ordinea sugerat! de aceast! liter!:
4 1 1 4 1 4
L: U: X:

2 3 2 3 3 2

Aplic!m pa"ii algoritmului Ven prezentat anterior:

1 4

4
3
2




L L L L L L L L L L
L L L L L L L L L L
L L L L L L L U L L
U U U U U U U L U U
X X X X X X X X X X
248 12. Tablouri bidimensionale

Ob#inem:

60 57 32 29 4 1 96 93 68 65
58 59 30 31 2 3 94 95 66 67
64 61 56 53 28 25 20 17 92 89
62 63 54 55 26 27 18 19 90 91
88 85 80 77 49 52 24 21 16 13
86 87 78 79 50 51 22 23 14 15
9 12 81 84 76 73 45 48 37 40
10 11 82 83 74 75 46 47 38 39
33 36 5 8 97 100 69 72 41 44
35 34 7 6 99 98 71 70 43 42

12.4. Implement"ri sugerate
Pentru a v! familiariza cu modul n care trebuie rezolvate problemele n cadrul c!rora
intervin opera#ii cu fi"iere text, v! suger!m s! ncerca#i s! implementa#i algoritmi pentru:
1. suma elementelor unui tablou bidimensional;
2. identificarea liniei "i coloanei pe care se afl! minimul/maximul unui tablou bidi-
mensional;
3. suma elementelor de pe diagonala principal!;
4. suma elementelor de pe diagonala secundar!;
5. suma elementelor de deasupra (de dedesubtul) diagonalei principale;
6. suma elementelor de deasupra (de dedesubtul) diagonalei secundare;
12. Tablouri bidimensionale 249

7. determinarea sumei celor opt vecini ai unui element;
8. determinarea sumelor elementelor aflate n triunghiul de N, S, E "i V delimitat de
diagonalele matricei;
9. rotirea unui tablou bidimensional cu 90 de grade;
10. determinarea matricei simetrice fa#! de diagonala principal! (secundar!);
11. nlocuirea elementelor din triunghiul de nord cu cele din triunghiul de vest ("i va-
riante);
12. parcurgerea pe diagonale a unei matrice;
13. parcurgerea n spiral! a unei matrice;
14. calcularea sumelor de-a lungul laturilor matricelor p!tratice;
15. verificarea unei propriet!#i globale a unui tablou bidimensional;
16. produsul a dou! matrice de numere;
17. produsul a n matrice;
18. inversarea a dou! linii/coloane ntr-o matrice;
19. ordonarea liniilor astfel nct elementele de pe diagonala principal!/secundar! s!
fie n ordine cresc!toare/descresc!toare;
20. verificarea triunghiularit!#ii unei matrice (inferior, superior triunghiular!);
21. suma elementelor unui tablou n-dimensional;
22. identificarea coordonatelor unui element avnd o valoare dat! (toate apari#iile) n-
tr-un tablou n-dimensional;
23. verificarea propriet!#ii de p!trat magic.

12.5. Probleme propuse

12.5.1. Pe#tera
O pe"ter! are n nc!peri numerotate de la 1 la n. ntre anumite nc!peri s-au amenajat
coridoare de acces, altele au r!mas izolate. Administratorul complexului turistic c!ruia
i s-a dat n grij! pe"tera ar vrea s! "tie r!spunsul la urm!toarele ntreb!ri:
1. Care sunt nc!perile n care intr! cele mai multe coridoare?
2. Care sunt nc!perile unde pe"tera se nfund!?
3. Care sunt nc!perile izolate?

Date de intrare
Prima linie a fi"ierului de intrare PESTERA.IN con#ine num!rul natural nenul n al n-
c!perilor pe"terii. Pe urm!toarele n linii sunt scrise cte n valori 0 "i 1, valorile ele-
mentelor unui tablou bidimensional p. Valorile 0 "i 1 au urm!toarea semnifica#ie:
) p
ij
= 1, dac! ntre nc!perea i "i nc!perea j exist! cale de acces amenajat!.
) p
ij
= 0, n caz contrar.
Valorile scrise pe o aceea"i linie din fi"ier sunt desp!r#ite prin cte un spa#iu.

250 12. Tablouri bidimensionale

Date de ie#ire
Pe prima linie a fi"ierului de ie"ire PESTERA.OUT se vor scrie numerele de ordine ale
nc!perilor n care intr! sau din care ies un acela"i num!r maxim de coridoare.
Pe a doua linie se vor afla numerele de ordine ale nc!perilor n care pe"tera se
nfund!. n cazul n care nu exist! astfel de nc!peri, n fi"ier se va scrie mesajul 'Nu
exista'.
A treia linie a fi"ierului ("i ultima) va con#ine numerele de ordine ale nc!perilor
izolate. Dac! asemenea nc!peri nu exist!, se va afi"a mesajul: 'Nu exista.'

Restric!ii #i preciz"ri
) 1 + n + 100.

Exemple
PESTERA1.IN
5
0 0 1 0 0
0 0 0 0 0
1 0 0 0 1
0 0 0 0 1
0 0 1 1 0
PESTERA1.OUT
3 5
1 4
2

PESTERA2.IN
5
0 1 1 0 0
1 0 0 0 0
1 0 0 0 1
0 0 0 0 1
0 0 1 1 0
PESTERA2.OUT
1 3 5
2 4
Nu exista.

12.5.2. Acvariul cu pe#ti
ntr-un acvariu sunt introdu"i n pe"ti de diferite specii, printre care "i unele carnivore.
Pentru fiecare pe"te se cunosc pe"tii pe care acesta i-ar mnca (n cazul n care m!-
nnc! al#i pe"ti). Deoarece nu to#i pe"tii sunt foarte nfometa#i, nu se cunoa"te ordinea
n care ace"tia se vor ataca. Stabili#i speciile de pe"ti care, dup! un interval de timp,
vor r!mne n via#! n mod sigur!

Date de intrare
Pe prima linie a fi"ierului de intrare PESTI.IN se g!se"te num!rul natural nenul n, re-
prezentnd num!rul de pe"ti. Pe urm!toarele n linii se afl! elementele tabloului bidi-
mensional p, avnd valori 0 "i 1 (desp!r#ite prin spa#ii) cu urm!toarea semnifica#ie:
) p
ij
= 1, dac! specia i m!nnc! specia j.
) p
ij
= 0, n caz contrar.
12. Tablouri bidimensionale 251

Date de ie#ire
Pe prima linie a fi"ierului de ie"ire PESTI.OUT se va scrie un "ir de numere, separate
prin cte un spa#iu, reprezentnd numerele de ordine a speciilor de pe"ti care supravie-
#uiesc n mod sigur n acvariu.

Restric!ii #i preciz"ri
) 1 + n + 100;
) Dac! un pe"te de specia i m!nnc! pe"ti de specia j "i specia j m!nnc! pe"ti de
specia i, nici unul nu r!mne n mod sigur n via#!, deoarece nu "tim nimic referitor
la ordinea n care ei se vor mnca ntre ei.

Exemplu
PESTI.IN
6
0 0 1 0 0 0
0 0 0 0 0 0
0 1 0 0 0 0
1 0 0 0 0 1
0 0 0 0 0 0
0 0 0 0 0 0
PESTI.OUT
4 5
Explica"ie
Pe"tele 1 m!nnc! pe"tele 3.
Pe"tele 2 nu este carnivor.
Pe"tele 3 m!nnc! pe"tele 2.
Pe"tele 4 m!nnc! pe"tele 1 "i 6.
Pe"tele 5 "i pe"tele 6 nu sunt carnivori.
Deci, deoarece pe"tii 1, 2, 3 "i 6 pot fi
mnca#i de al#i pe"ti, r!mn n via#! cu
siguran#! pe"tii 4 "i 5.

12.5.3. Tir sportiv
Un matematician, iubitor de tir sportiv, "i-a pus problema construirii unei #inte p!trate
de latur! n n care punctajele s! fie distribuite dup! reguli matematice proprii. El mai
nti a generat "irul punctajelor pe baza unei reguli, ob#innd: 2, 3, 4, 2, 5, 6, 3, 7, 8, 4,
9, 3, 10, 5, 11, 12, 6, ...


2 3 4 2 5 6 3 7 8
22 11 23 ... 4
7 9
21 3
10 10
20 5
9 11
18 12
17 8 16 5 15 7 14 13 6

252 12. Tablouri bidimensionale

Se observ! c! fiecare num!r natural neprim este urmat de cel mai mare divizor
(prim sau nu) al s!u. Pentru o bun! distribu#ie a acestor numere, matematicianul s-a
gndit s! le a"eze pe #inta p!tratic! de-a lungul unei spirale, ncepnd din col#ul stn-
ga-sus, continund spre dreapta, apoi n jos, urmnd apoi marginea de jos de la dreapta
la stnga, apoi n sus "i continund spirala ct timp este posibil.
Scrie#i un program care construie"te #inta pentru un p!trat de latur! n, respectnd
regulile matematicianului.

Date de intrare
n fi"ierul de intrare TIR.IN se g!se"te num!rul natural nenul n, reprezentnd lungi-
mea laturii #intei.

Date de ie#ire
%inta generat! se va scrie sub forma unui tablou bidimensional n fi"ierul de ie"ire
TIR.OUT, unde pe linia i se vor scrie elementele situate pe cea de-a i-a linie n #int!.
Numerele scrise pe linii vor fi separate prin cte un spa#iu.

Restric!ii #i preciz"ri
) 1 + n + 150.

Exemplu
TIR.IN
5
TIR.OUT
2 3 4 2 5
12 6 13 14 6
11 8 17 7 3
5 16 5 15 7
10 3 9 4 8

12.5.4. Biliard
O bil! este lovit! cu tacul pe o mas! de biliard dreptunghiular!, de dimensiune m ! n
ntr-o direc#ie oblic! (dreapta-sus, dreapta-jos, stnga-jos sau stnga-sus). Atunci cnd
bila se love"te de o margine a mesei, cu excep#ia col#urilor, ea rico"eaz!, noul traseu al
ei formnd un unghi de 90/ cu vechiul traseu. Dac! bila ajunge ntr-un col#, ea iese de
pe mas!. Cunoscnd dimensiunile mesei, pozi#ia de plecare a bilei "i direc#ia de depla-
sare ini#ial!, s! se simuleze mi"carea bilei pn! la ie"irea de pe mas!, sau pn! cnd se
observ! c! traseul acesteia intr! n ciclu.

Date de intrare
Prima linie a fi"ierului de intrare BILIARD.IN con#ine numerele m "i n, reprezentnd
dimensiunea mesei. Pe linia a doua se g!sesc coordonatele pozi#iei ini#iale a bilei, iar
pe a treia linie se afl! o cifr! din mul#imea {1, 2, 3, 4}, reprezentnd direc#ia de porni-
re a bilei: 1 corespunde direc#iei dreapta-sus, 2 direc#iei dreapta-jos, 3 direc#iei stnga-
jos, iar 4 direc#iei stnga-sus.
12. Tablouri bidimensionale 253

Date de ie#ire
Fi"ierul de ie"ire BILIARD.OUT va con#ine traseul bilei sub forma unui tablou bidi-
mensional de dimensiuni corespunz!toare mesei. Fiecare linie a tabloului se va scrie
pe linie nou! n fi"ier. Elementul corespunz!tor pozi#iei ini#iale a bilei se marcheaz! cu
1, urm!toarea pozi#ie atins! de bil! conform direc#iei de mi"care cu 2 etc. n cazul n
care bila trece a doua oar! printr-o pozi#ie, se p!streaz! primul marcaj. Pozi#iile nestr!-
b!tute vor con#ine valoarea 0.
Dac! bila nu poate ie"i de pe mas!, deoarece traseul ei formeaz! un ciclu, n fi"ier
se va scrie mesajul 'Bila nu poate iesi de pe masa.', apoi se va scrie n fi"i-
er tabloul bidimensional corespunz!tor mi"c!rilor bilei.

Restric!ii #i preciz"ri
) 1 + m, n + 100.

Exemple
BILIARD1.IN
3 3
2 1
1


BILIARD2.IN
5 7
4 2
1


BILIARD1.OUT
Bila nu poate iesi de pe masa.
0 2 0
1 0 3
0 4 0

BILIARD2.OUT
12 0 0 0 4 0 0
0 11 0 3 0 5 0
0 0 2 0 0 0 6
0 1 0 9 0 7 0
0 0 0 0 8 0 0

12.5.5. Puncte #a
Se nume"te punct #a ntr-un tablou bidimensional, pozi#ia n care elementul este mi-
nim pe coloana lui "i maxim pe linie, sau invers. Scrie#i un program care determin!
toate punctele "a ntr-o matrice bidimensional! dreptunghiular!.

Date de intrare
Prima linie a fi"ierului de intrare SA.IN con#ine numerele m "i n, reprezentnd dimen-
siunile tabloului. Pe fiecare dintre urm!toarele m linii se afl! cte n numere ntregi,
desp!r#ite prin cte un spa#iu, reprezentnd elementele matricei.

Date de ie#ire
Fi"ierul de ie"ire SA.OUT va con#ine attea linii cte puncte "a s-au g!sit. Corespunz!-
tor unui astfel de punct n fi"ier se vor scrie dou! numere naturale, desp!r#ite printr-un
spa#iu, reprezentnd indicii punctului "a. Dac! tabloul dat nu are nici un punct "a, n
fi"ier se va scrie mesajul 'Nu exista punct sa.'.
254 12. Tablouri bidimensionale

Restric!ii #i preciz"ri
) 1 + n + 100;
) 1 + m + 100;
) Numerele tabloului sunt distincte.

Exemple
SA.IN
3 4
2 -1 3 0
1 0 4 0
5 -8 9 1
SA.OUT
1 3
2 2


12.5.6. Rame de tablouri care trebuie suprapuse
ntr-un spa#iu dreptunghiular de dimensiune m ! n trebuie a"ezate una dup! alta p ra-
me de tablouri de dimensiune dat!. Ramele se pot a"eza unele peste altele, astfel nct
laturile lor vor fi paralele cu marginile spa#iului de depozitare.
S! se afi"eze, sub forma precizat! la date de ie"ire ceea ce va vedea din ramele su-
prapuse o persoan! care se va uita la teancul de rame dintr-o pozi#ie situat! deasupra
spa#iului n care acestea s-au a"ezat.

Date de intrare
De pe prima linie a fi"ierului de intrare RAME.IN se vor citi numerele m "i n, reprezen-
tnd dimensiunile spa#iului n care se a"eaz! ramele. Pe urm!toarea linie se afl! num!-
rul natural p, reprezentnd num!rul ramelor care trebuie suprapuse. Urm!toarele p linii
con#in fiecare coordonatele col#ului stnga-sus (indicele de linie "i de coloan!) al unei
rame, lungimea (n num!r de linii) "i l!#imea (n num!r de coloane) a ramei.

Date de ie#ire
n fi"ierul de ie"ire RAME.OUT se va scrie un tablou bidimensional de caractere, repre-
zentnd imaginea cu ramele suprapuse. Pentru o ram! se va specifica doar chenarul ei.
Acestea se vor codifica cu literele mari ale alfabetului englez n ordinea n care sunt
descrise n fi"ierul de intrare, ncepnd cu litera 'A'. Atunci cnd o ram! se suprapune
peste una a"ezat! deja i va acoperi caracterele din chenar n pozi#iile n care cele dou!
rame se intersecteaz! pe l!#imea unui singur caracter (coloan!).

Restric!ii #i preciz"ri
) 1 + m + 100;
) 1 + n + 100;
) 1 + p + 25;
) Dac! dimensiunile unei rame dep!"esc spa#iul de depozitare, rama respectiv! nu
va fi depozitat!, iar litera care i corespunde nu va fi utilizat!.
12. Tablouri bidimensionale 255

Exemplu
RAME.IN RAME.OUT
12 9 C C C C C C
3 B C B C
3 1 8 7 A A B C B A A C
2 3 4 3 A B C B A C
1 4 12 6 A B C B A C
A C A C
A C A C
A C A C
A C A C
A A A C A A A C
C C
C C C C C C

12.5.7. Rame de tablouri suprapuse
ntr-un spa#iu dreptunghiular de dimensiune m ! n au fost a"ezate una dup! alta p rame
de tablouri. Ramele pot fi a"ezate unele peste altele, astfel nct laturile lor vor fi pa-
ralele cu marginile spa#iului de depozitare.
Cunoscnd imaginea pe care o vede din ramele suprapuse o persoan! care se uit! la
teancul de rame dintr-o pozi#ie situat! deasupra spa#iului n care acestea s-au a"ezat, s!
se determine ordinea n care este posibil! ridicarea tuturor ramelor. Se "tie c! fiecare
ram! este descris! n mod unic folosind o liter! mare a alfabetului englez "i c! atunci
cnd au fost suprapuse dou! rame se va vedea complet numai rama de deasupra.

Date de intrare
De pe prima linie a fi"ierului de intrare RAME.IN se citesc dimensiunile m "i n a spa#i-
ului n care a"ez!m ramele. De pe urm!toarele m linii se cite"te imaginea pe care o ve-
de persoana. Codificarea imaginii este realizat! ntr-un tablou bidimensional corespun-
z!tor spa#iului de depozitare n care pentru o ram! se va specifica doar chenarul ei.
Acestea sunt codificate cu literele mari ale alfabetului englez n ordinea n care au fost
depozitate. Atunci cnd o ram! s-a suprapus peste una a"ezat! deja ea acoper! caracte-
rele din chenar n pozi#iile n care cele dou! rame se intersecteaz! pe l!#imea unui sin-
gur caracter (coloan!).

Date de ie#ire
Fi"ierul RAME.OUT va con#ine un "ir de litere mari ale alfabetului englez, desp!r#ite
printr-un spa#iu, care corespund ramelor n ordinea n care acestea se pot ridica.

Restric!ii #i preciz"ri
) 1 + m + 100;
) 1 + n + 100;
256 12. Tablouri bidimensionale

) 1 + p + 25;
) Din fiecare latur! a fiec!rei rame se vede cel pu#in un punct.

Exemplu
RAME.IN RAME.OUT
12 9 O V K
O O O O O O

V O V O
K K V O V K K O

K V O V K O
K V O V K O
K O K O
K O K O
K O K O
K O K O
K K K O K K K O
O O
O O O O O O

12.5.8. Prelucrare de imagine
O imagine alb-negru este preluat! codificat ntr-un tablou bidimensional de valori 0
sau 1 de dimensiune m ! m. Asupra acestei imagini se pot efectua urm!toarele trans-
form!ri:
) Transformarea video Invers: valorile 0 se transform! n 1 iar valorile 1 n 0.
) Rotire cu 90: se creeaz! un tablou rotit n sensul acelor de ceasornic.
) Zoom: imaginea se m!re"te la dimensiunea 2m ! 2m.
Se define"te o secven#! de transform!ri ca fiind o succesiune de litere I, R "i Z.
S! se afi"eze tabloul bidimensional la care s-a ajuns n urma unui "ir de transfor-
m!ri cerute.

Date de intrare
De pe prima linie a fi"ierului de intrare IMAG.IN se cite"te un num!r natural m, repre-
zentnd dimensiunea tabloului. Pe urm!toarele m linii se afl! elementele tabloului bi-
dimensional corespunz!tor unei imagini, linie dup! linie. Elementele sunt separate
prin cte un spa#iu.
Din fi"ierul de intrare TRANS.IN se cite"te succesiunea de litere I, R "i Z corespun-
z!toare unor transform!ri dorite. Aceste caractere nu sunt desp!r#ite de spa#iu.

Date de ie#ire
Pe prima linie a fi"ierului IMAG.OUT se vor scrie dimensiunile actuale ale tabloului.
Pe urm!toarele linii se vor afla elementele tabloului bidimensional ob#inute ca urmare
a transform!rilor efectuate.
12. Tablouri bidimensionale 257

Restric!ii #i preciz"ri
) 1 + m + 100 (indiferent de transform!rile aplicate);
) literele sunt majuscule din alfabetul englez.

Exemple
IMAG.IN
8
0 0 0 0 0 0 0 0
0 1 0 0 0 0 1 0
1 1 1 0 0 1 1 1
0 0 0 0 0 0 0 0
0 1 0 0 0 0 1 0
0 0 1 0 0 1 0 0
0 0 0 1 1 0 0 0
0 0 0 0 0 0 0 0
TRANS.IN
RIR
IMAG.OUT
8
1 1 1 1 1 1 1 1
1 1 1 0 0 1 1 1
1 1 0 1 1 0 1 1
1 0 1 1 1 1 0 1
1 1 1 1 1 1 1 1
0 0 0 1 1 0 0 0
1 0 1 1 1 1 0 1
1 1 1 1 1 1 1 1

IMAG.IN
4
1 1 1 1
1 0 0 1
1 0 0 1
1 1 1 1
TRANS.IN
Z
IMAG.OUT
8
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
1 1 0 0 0 0 1 1
1 1 0 0 0 0 1 1
1 1 0 0 0 0 1 1
1 1 0 0 0 0 1 1
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1

12.5.9. Careu magic
S! se genereze un p!trat magic de dimensiune n, unde n este un num!r ntreg pozitiv.

Date de intrare
n fi"ierul de intrare MAG.IN se g!se"te num!rul n, reprezentnd dimensiunea careului
care trebuie generat.

Date de ie#ire
Pe prima linie a fi"ierului de ie"ire MAG.OUT se va afla num!rul n. Pe urm!toarele n li-
nii se vor scrie numerele de pe cele n linii ale careului, dou! numere fiind separate
prin cte un spa#iu.

Restric!ii #i preciz"ri
) 1 + n + 40.

258 12. Tablouri bidimensionale

Exemple
MAG.IN
6

MAG.OUT
6
6 32 3 34 35 1
7 11 27 28 8 30
19 14 16 15 23 24
18 20 22 21 17 13
25 29 10 9 26 12
36 5 33 4 2 31
Explica"ie
n este num!r par f!r! a fi
multiplu de 4.
MAG.IN
4
MAG.OUT
4
4 14 15 1
9 7 6 12
5 11 10 8
16 2 3 13
Explica"ie
n este multiplu de 4.

MAG.IN
3
MAG.OUT
3
4 9 2
3 5 7
8 1 6
Explica"ie
n este num!r impar.

12.6. Solu!iile problemelor propuse

12.5.1. Pe#tera
Vom descompune problema n subprobleme "i vom proiecta pentru fiecare subproble-
m! rezolv!ri pe care le vom implementa folosind subprograme.
1. Tabloul bidimensional care con#ine particularit!#ile pe"terii l citim din fi"ier.

Subalgoritm Citire(n,p):
cite!te n
pentru i=1,n execut":
pentru j=1,n execut":
cite!te p[i,j]
sfr!it pentru
sfr!it pentru
sfr!it subalgoritm

2. Num!r!m coridoarele care intr! n nc!peri. Cunoa"tem semnifica#ia valorilor
p
ij
, deci, pentru a determina num!rul coridoarelor care se ntlnesc n nc!perea
i (pentru i fixat "i valori posibile i =1, 2, , n), vom aduna valorile p
ij
, unde
j = 1, 2, , n, adic! vom aduna elementele pe linii.

12. Tablouri bidimensionale 259

Subalgoritm Num"rare(n,p,nr_coridoare):
pentru i=1,n execut":
nr_coridoare[i] 0 0
pentru j=1,n execut":
nr_coridoare[i] 0 nr_coridoare[i] + p[i,j]
sfr!it pentru
sfr!it pentru
sfr!it subalgoritm

3. Determin!m valoarea maxim! a numerelor care reprezint! num!rul coridoare-
lor care se ntlnesc ntr-o nc!pere.

Subalgoritm Maxim(n,nr_coridoare,max):
max 0 nr_coridoare[1]
pentru i=2,n execut":
dac" nr_coridoare[i] > max atunci
max 0 nr_coridoare[i]
sfr!it dac"
sfr!it pentru
sfr!it subalgoritm

4. Selectarea numerelor de ordine ale nc!perilor n care intr! sau ies un acela"i
num!r maxim de coridoare se realizeaz! cu un algoritm de selectare:

Subalgoritm CareMax(n,nr_coridoare,max):
pentru i=1,n execut":
dac" nr_coridoare[i] = max atunci
scrie i
sfr!it dac"
sfr!it pentru
sfr!it subalgoritm

5. Determin!m nc!perile n care pe"tera se nfund!, folosind "irul construit ante-
rior. Dac! valoarea elementului avnd indicele i este egal cu 1 (am putut veni
de undeva pe un coridor pn! aici), atunci pe"tera se nfund! n nc!perea i.

Subalgoritm Se_nfund"(n,nr_coridoare):
g"sit 0 fals
pentru i=1,n execut":
dac" nr_coridoare[i] = 1 atunci
scrie i
g"sit 0 adev!rat
sfr!it dac"
sfr!it pentru
260 12. Tablouri bidimensionale

dac" nu g"sit atunci
scrie 'Nu exista.'
sfr!it dac"
sfr!it subalgoritm

6. Depistarea nc!perilor izolate o realiz!m cu ajutorul aceluia"i "ir, c!utnd ele-
mente egale cu 0 (nu intr!, nu iese nici un coridor).

Subalgoritm Izolate(n,nr_coridoare):
g"sit 0 fals
pentru i=1,n execut":
dac" nr_coridoare[i] = 0 atunci
scrie i
g"sit 0 adev!rat
sfr!it dac"
sfr!it pentru
dac" nu g"sit atunci
scrie 'Nu exista.'
sfr!it dac"
sfr!it subalgoritm

12.6.2. Acvariul cu pe#ti
Este evident c!, din cauza c! nu "tim nimic despre ordinea n care se m!nnc! pe"tii,
pentru a depista speciile care r!mn sigur n via#!, este suficient s! c!ut!m n tabloul
dat coloanele care nu con#in nici o valoare 1. Indicii acestor coloane reprezint! nume-
rele de ordine ale speciilor c!utate.
Vom parcurge tabloul dat pe linii "i vom marca ntr-o variabil! boolean! (victim!)
cu valoarea adev!rat, dac! pe linia respectiv! g!sim cel pu#in o valoare 1. Cu alte cu-
vinte, pe"tii care pot fi mnca#i de un alt pe"te, indiferent care, sunt marca#i ca victime.
Aceast! prelucrare o putem realiza n paralel cu citirea datelor. De asemenea, nainte
s! trecem la alt! linie, n cazul n care pe"tele de indice i nu este victim!, l scriem n
fi"ier.

Algoritm Citire_cu_Prelucrare(n,p,victim"):
cite!te n
pentru i=1,n execut":
victim" 0 fals
pentru j=1,n execut":
cite!te p[i,j]
dac" p[i,j] = 1 atunci
victim" 0 adev!rat
sfr!it dac"
sfr!it pentru
12. Tablouri bidimensionale 261

dac" nu victim" atunci
scrie i { afi#area speciilor supravie"uitoare }
sfr!it dac"
sfr!it pentru
sfr!it subalgoritm

12.6.3. Tir sportiv
Pentru rezolvarea acestei probleme este util s! cre!m n prealabil "irul de numere dup!
regula enun#at!. Pentru valori mici ale lui n "irul va fi creat ntr-un tablou unidimensi-
onal, pentru valori mari ale lui n putem crea "irul respectiv ntr-un fi"ier de tip text.
De asemenea, l!s!m pe seama cititorilor s! realizeze o implementare n care numerele
generate se scriu direct pe #int!, evitnd astfel utilizarea unui "ir (sau fi"ier) de lucru.
n pseudocodul descris n continuare nu verific!m separat dac! num!rul este prim
sau nu, ci n primul rnd, dup! ce orice num!r curent k s-a scris n "ir, vom c!uta
primul s!u cel mai mic divizor, urmnd s! folosim n "ir ctul mp!r#irii ntregi al lui k
la acesta (adic! pe cel mai mare divizor). Dac! nu g!sim un astfel de divizor, nseamn!
c! num!rul nu este prim, iar divizorul g!sit l scriem n fi"ier.

Subalgoritm Generare#ir(nn): { nn = n*n, num!rul numerelor pe "int! }
i 0 0 { i = num!r! numere generate }
k 0 2 { k = numerele pe care le scriem n fi#ier, primul num!r este 2 }
ct timp i<nn execut":
i 0 i + 1 { cre#te contorul p!tr!"elelor ocupate }
scrie k { l scriem pe k n fi#ier }
rad 0 parte ntreag! din r!d!cina p!trat! a lui k
dac" k este num!r par atunci
divizor 0 2
altfel
divizor 0 3 { cel mai MIC divizor al lui k }
ct timp (k mod divizor 1 0) !i (divizor + rad) execut":
divizor 0 divizor + 2 { divizori impari }
sfr!it ct timp
sfr!it dac"
dac" divizor + rad atunci { avem un divizor }
i 0 i + 1 { ne preg!tim s! scriem un num!r n fi#ier }
dac" i + nn atunci { l scriem numai dac! avem nevoie de el }
scrie k div divizor { scriem cel mai MARE divizor }
sfr!it dac"
sfr!it dac"
k 0 k + 1 { urm!torul num!r }
sfr!it ct timp
sfr!it subalgoritm
262 12. Tablouri bidimensionale

Avnd numerele necesare #intei generate n fi"ier, le vom citi unul cte unul "i le
vom a"eza n tabloul bidimensional pe pozi#ia corespunz!toare parcurgerii acestuia n
spiral!.
Vom re#ine cteva propriet!#i pe care le vom fructifica n algoritm:
1. Mai nti observ!m c! aceast! spiral! se termin!, fie dup! o parcurgere a ultimelor
pozi#ii din stnga spre dreapta (dimensiunea tabloului este num!r impar), fie dup! o
parcurgere a ultimelor pozi#ii din dreapta spre stnga (dimensiunea tabloului este nu-
m!r par).
n figurile de mai jos sunt prezentate cele dou! cazuri, pentru n = 3, respectiv n = 4.



2. O alt! observa#ie se refer! la faptul c!, atunci cnd suntem pe cercul exterior al
spiralei, avem de parcurs linia 1 de la primul s!u element la ultimul, a n-a coloan! de
la al doilea element al s!u (primul a fost parcurs atunci cnd am lucrat pe linia 1) la ul-
timul, apoi a n-a linie de la penultimul element la primul. n final, vom parcurge prima
coloan! de la penultimul s!u element pn! la al doilea (ultimul a fost parcurs atunci
cnd am prelucrat ultima linie, iar primul atunci cnd am prelucrat linia 1). Ceea ce
este "i mai important de observat se refer! la faptul c! atunci cnd vom parcurge un
cerc interior, imediat urm!tor exteriorului, toate limitele de nceput cresc cu 1, iar
limitele de sfr#it scad cu 1. n consecin#!, vom ini#ializa dou! variabile (primul cu 1
"i ultimul cu n) care "i vor schimba valorile dup! nchiderea unui cerc a spiralei
(primul 0 primul + 1, ultimul 0 ultimul - 1).
Din observa#ia 1. rezult! c! vom ncepe a"ezarea numerelor din fi"ier, indiferent de
paritatea lui n parcurgnd elementele tabloului pe linia de indice primul spre dreapta.
Ar urma parcurgerea de sus n jos a coloanei de indice ultimul, dar aceast! parcurgere
nu ntotdeauna este posibil! (necesar!) "i anume, dac! n este impar, dup! o asemenea
parcurgere se termin! prelucrarea. Subalgoritmul care creeaz! #inta este urm!torul:

Subalgoritm Creare$int"(n,nn,%inta):
primul 0 1
ultimul 0 n
folosite 0 0
parcurgem prima linie de la stnga la dreapta
dac" n este num!r impar atunci
ct timp folosite < nn execut":
{ n variabila folosite num!r!m pozi"iile prelucrate pe "int! }
parcurgem coloana de indice ultimul de sus n jos
12. Tablouri bidimensionale 263

parcurgem linia de indice ultimul de la dreapta la stnga
parcurgem coloana de indice primul de jos n sus
primul 0 primul + 1
ultimul 0 ultimul - 1
parcurgem linia de indice primul de la stnga la dreapta
sfr!it ct timp
altfel n este num!r impar atunci
parcurgem ultima coloan! de sus n jos
parcurgem ultima linie de la dreapta la stnga
ct timp folosite < nn execut":
{ n variabila folosite num!r!m pozi"iile prelucrate pe "int! }
parcurgem coloana de indice primul de jos n sus
primul 0 primul + 1
ultimul 0 ultimul - 1
parcurgem linia de indice primul de la stnga la dreapta
parcurgem coloana de indice ultimul de sus n jos
parcurgem linia de indice ultimul de la dreapta la stnga
sfr!it ct timp
sfr!it dac"
sfr!it subalgoritm

Parcurgerile men#ionate mai sus nu sunt problematice. Trebuie doar s! avem grij!
s! nu prelucr!m un acela"i element de dou! ori, deoarece astfel am suprascrie anumite
valori "i n final nu ne-ar ajunge numerele generate n fi"ier. Pentru exemplificare, s!
vedem parcurgerea de jos n sus:

Subalgoritm JosSus(primul,ultimul,folosite):
pentru i=ultimul-1,primul+1,-1 execut": { pasul este 1! }
folosite 0 folosite + 1
cite!te nr { se cite#te num!rul curent din fi#ierul de manevr! }
%int"[i,primul] 0 nr
{ elementul de pe linia i #i coloana primul n tabloul corespunz!tor "intei }
sfr!it pentru
sfr!it subalgoritm

12.6.4. Biliard
Rezolvarea problemei necesit! simularea anumitor deplas!ri de-a lungul unor linii care
sunt paralele cu diagonalele p!tratului decupat de mi"carea bilei din tabloul bidi-
mensional dreptunghiular, corespunz!tor mesei "i o st!pnire corect! a schimb!rilor
de direc#ie atunci cnd bila se love"te de marginea mesei.
264 12. Tablouri bidimensionale

Vom defini dou! "iruri de cte patru elemente n care vom p!stra valorile care tre-
buie adunate coordonatei x, respectiv coordonatei y, pentru a ne deplasa pe o direc#ie
dat! d. Deplasarea n cele patru direc#ii le putem codifica n felul urm!tor:

d 1


2

3

4

pozi#ia curent! i, j i, j i, j i, j
noua pozi#ie i 1, j + 1
scade linia
cre"te coloana
i + 1, j + 1
cre"te linia
cre"te coloana
i + 1, j 1
cre"te linia
scade coloana
i 1, j 1
scade linia
scade coloana
Dx 1 1 1 1
Dy 1 1 1 1

La fiecare pas, coordonatele i "i j se modific! n i + Dx[d], respectiv j + Dy[d].
Acest mod de reprezentare ne va u"ura gestionarea schimb!rilor de direc#ie.

Observ!m c! la ntlnirea unei margini a mesei, corespunz!toare unei margini ver-
ticale n tablou, direc#ia de deplasare se modific! astfel:


direc#ia 3 se transform! n direc#ia 2, "i invers:






direc#ia 1 se transform! n direc#ia 4 "i 4 n 1:




La ntlnirea unei margini a mesei, corespunz!toare unei margini orizontale n ta-
blou, direc#ia 1 se schimb! n direc#ia 2 "i 2 n 1, iar direc#ia 4 se transform! n 3 "i 3
n 4. Vom asigura schimbarea direc#iei cu o structur! de tip repet", care se va execu-
ta pn! cnd bila iese printr-un col# sau intr! n ciclu.
n subalgoritmul urm!tor, n variabila pas gener!m valoarea care marcheaz! mo-
mentul n care bila traverseaz! un anumit punct de pe mas!. Dac! mingea ar urma s!-
"i reia traseul "i astfel s! intre n ciclu infinit, variabila boolean! infinit prime"te valoa-
rea adev!rat. Pentru a avea control asupra momentului n care bila iese de pe mas!
(ajunge ntr-un col#) ne folosim de o func#ie boolean!:
12. Tablouri bidimensionale 265

Subalgoritm Afar":
Afar" 0 ((i = 1) sau (i = m)) !i ((j = 1) sau (j = n))
sfr!it subalgoritm

Rezolvarea problemei const! n simularea mi"c!rii bilei. Anterior apelului subalgo-
ritmului Mi!care s-au citit datele de intrare "i s-a ini#ializat tabloul a cu elemente nule.

Subalgoritm Mi!care(m,n,i,j,a,infinit):
x 0 dx[dir]
y 0 dy[dir]
pas 0 1 { contorul pentru marcarea pozi"iilor str!b!tute }
a[i,j] 0 pas
se_repet" 0 fals
infinit 0 fals
ct timp mingea nu a ie#it afar! !i nu infinit execut":
pas 0 pas + 1 { cre#te contorul de pozi"ii }
i 0 i + x { deplasare pe direc"ia dir, pn! la ntlnirea unei margini }
j 0 j + y
dac" (i = 0) sau (i > m) atunci{ bila s-a lovit de o margine orizontal! }
x 0 -x
i 0 i+2*x
sfr!it dac"
dac" (j = 0) sau (j > n) atunci{ bila s-a lovit de o margine vertical! }
y 0 -y
j 0 j + 2*y
sfr!it dac"
dac" a[i,j]=0 atunci { dac! aceast! pozi"ie nu a fost str!b!tut! nc! }
se repet" 0 fals
a[i,j] 0 pas { o marc!m }
altfel { dac! aceast! pozi"ie a mai fost marcat! #i este pe o margine }
dac" se_repet" !i (a[i,j] = 2) atunci
infinit 0 adev!rat { bila a intrat n mi#care ciclic! deoarece }
{ din pozi"ia marcat! cu 1 a ajuns n pozi"ia marcat! cu 2 }
altfel
dac" a[i,j] = 1 atunci
se_repet" 0 adev!rat
altfel se_repet" 0 fals
sfr!it dac"
sfr!it dac"
sfr!it dac"
sfr!it ct timp
sfr!it subalgoritm
266 12. Tablouri bidimensionale

Afi"area tabloului a, corespunz!tor mesei de biliard, este precedat! de verificarea
variabilei infinit pentru a stabili dac! se va scrie mesajul referitor la mi"carea bilei:

Subalgoritm Afi!are:
dac" infinit atunci
scrie 'Mingea nu poate iesi de pe masa.'
sfr!it dac"
pentru i=1,m execut":
pentru j=1,n execut":
scrie a[i,j]
sfr!it pentru
sfr!it pentru
sfr!it subalgoritm

12.6.5. Puncte #a
Subproblemele n care descompunem aceast! problem! sunt:
1. citirea tabloului;
2. determinarea minimului pe o linie a tabloului;
3. determinarea maximului pe o coloan! a tabloului;
4. determinarea maximului pe o linie a tabloului;
5. determinarea minimului pe o coloan! a tabloului;
6. compararea rezultatelor ob#inute la punctul 2. "i 3;
7. compararea rezultatelor ob#inute la punctul 4. "i 5.

Observ!m c! trebuie s! c!ut!m un minim (sau un maxim) ntr-o linie (respectiv n-
tr-o coloan!) din matrice. Aceast! observa#ie ne sugereaz! s! transform!m tabloul
bidimensional, ntr-un "ir de linii, folosindu-ne de declara#iile de tip "i de variabile:

type linie=array[1..4] of Integer;
TipTab=array[1..3] of linie;
var t:TipTab;
sir:linie;

Astfel linia i din tabloul t se va putea transmite ca parametru de tip linie subpro-
gramelor care determin! minimul (respectiv maximul) din linia respectiv!. Din p!cate
nu putem proceda la fel n cazul coloanelor dect dac! le transform!m temporar, cu un
subprogram simplu, n "ir de tip linie:

Subalgoritm Transform"(m,k,t,!ir):
{ transform! coloana k din tablou n #ir de tip linie }
pentru i=1,m execut": { coloanele au m elemente }
!ir[i] 0 t[i,k]
sfr!it pentru
sfr!it subalgoritm
12. Tablouri bidimensionale 267

Func#iile max(n,!ir,poz) "i min(n,!ir,poz) determin! valoarea maxim!,
respectiv minim! dintr-un "ir, returnnd totodat! "i pozi#ia unde s-a g!sit maximul,
respectiv minimul.
n algoritm vom traversa tabloul linie dup! linie. Pentru fiecare linie i, vom deter-
mina minimul (minim) "i pozi#ia lui pe linie (pozmin), apoi vom transforma coloana de
indice pozmin n "ir "i vom c!uta maximul lui (maxim). Dac! cele dou! valori sunt
egale (minim = maxim), afi"!m indicele liniei (i) "i indicele coloanei (pozmax). Proce-
d!m la fel, c!utnd maximul pe linie "i minimul pe coloana pe care am g!sit maximul.

Algoritm Puncte_#a:
Citirea datelor de intrare (m, n, t)
g"sit 0 fals
pentru i=1,m execut":
minim 0 min(n,t[i],pozmin)
{ minimul pe linia i se afl! pe coloana pozmin }
transform"(m,pozmin,t,!ir) { transform!m coloana pozmin n #ir }
maxim 0 max(m,!ir,pozmax) { maximul de pe coloana pozmin }
dac" minim = maxim atunci
scrie i,' ',pozmax
g"sit 0 adev!rat
sfr!it dac"
maxim 0 max(n,t[i],pozmax)
{ maximul pe linia i se afl! pe coloana pozmax }
transform"(m,pozmax,t,!ir) { transform!m coloana pozmax n #ir }
minim 0 min(m,!ir,pozmin) { minimul de pe coloana pozmax }
dac" maxim = minim atunci
scrie i,' ',pozmax
g"sit 0 adev!rat
sfr!it dac"
sfr!it pentru
dac" nu g"sit atunci
scrie 'Nu exista puncte sa.'
sfr!it dac"
sfr!it algoritm

Variabila g!sit prime"te valoarea adev!rat dac! am g!sit un punct "a. A fost nevoie
de re#inerea faptului c! am reu"it s! determin!m un rezultat pentru a scrie mesajul soli-
citat n cazul n care nu exist! punct "a n tablou.



268 12. Tablouri bidimensionale

12.6.6. Rame de suprapus
Algoritmul urm!tor traseaz! ramele pe rnd cu literele mari ale alfabetului englez,
ncepnd cu litera 'A' "i le depune ntr-un tablou bidimensional de caractere. Tabloul
va fi n prealabil ini#ializat cu caracterul spa#iu (' ').
n implementarea propus! desen!m prima ram! n spa#iul de depozitare, apoi n
acela"i tablou desen!m a doua ram!. Nu este nevoie de verific!ri, caracterul c curent
fie suprascrie un caracter spa#iu, fie un caracter apar#innd unei rame a"ezate deja.

Subalgoritm Rame_de_suprapus:
c 0 'A'
pentru k=1,p execut":
cite!te y1,x1 { indicele de linie #i de coloan! a col"ului stnga-sus }
cite!te Ly,Lx { lungimile laturilor ramei curente }
y2 0 y1 + Ly 1 { indicele de linie a col"ului dreapta-jos }
x2 0 x1 + Lx 1 { indicele de coloan! a col"ului dreapta-jos }
dac" (x2 + n) !i (y2 + m) atunci
pentru i=y1,y2 execut": { desen!m rama }
a[i,x1] 0 c { verticala din stnga }
a[i,x2] 0 c { verticala din dreapta }
sfr!it pentru
pentru j=x1+1,x2-1 execut":
a[y1,j] 0 c { orizontala de sus }
a[y2,j] 0 c { orizontala de jos }
sfr!it pentru
sfr!it dac"
{ caracterul cu care se va trasa urm!toarea ram! }
c 0 succesorul caracterului c
sfr!it pentru
sfr!it subalgoritm

12.6.7. Rame suprapuse
Problema este descompus! n subprobleme, dup! cum urmeaz!:
) Citirea datelor de intrare (dimensiunile spa#iului de depozitare "i tabloul de
caractere;
) Determinarea coordonatelor col#urilor ramelor;
) Determinarea pozi#iilor relative a ramelor (suprapunerile);
) Afi"area caracterelor cu care s-au desenat ramele, n ordinea n care acestea se pot
ridica.
Not!m cu minx
i
, miny
i
, maxx
i
, maxy
i
coordonatele col#ului stnga-sus "i a celui din
dreapta-jos a celei de a i-a rame. Aceste valori se pot ini#ializa cu coordonatele spa#iu-
lui de depozitare, deoarece sigur vom g!si cel pu#in o ram! mai mic! dect spa#iul.
12. Tablouri bidimensionale 269

Subalgoritm Dimensiuni(m,n,minx,miny,maxx,maxy):
pentru c='A','Z' execut":
minx[c] 0 n { ini"ializarea coordonatelor col"urilor }
miny[c] 0 m
maxx[c] 0 0
maxy[c] 0 0
sfr!it pentru
pentru i=1,m execut": { determinarea coordonatelor col"urilor }
pentru j=1,n execut":
{ determin!m coordonatele col"urilor ramei din care face parte pozi"ia curent! }
c 0 a[i,j]
dac" minx[c] > j atunci
minx[c] 0 j
sfr!it dac"
dac" miny[c] > i atunci
miny[c] 0 i
sfr!it dac"
dac" maxx[c] < j atunci
maxx[c] 0 j
sfr!it dac"
dac" maxy[c] < i atunci
maxy[c] 0 i
sfr!it dac"
sfr!it pentru
sfr!it pentru
sfr!it subalgoritm

Pentru a determina pozi#iile relative ale ramelor, vom construi un tablou de cons-
tante logice peste, n care valoarea elementului peste
xy
va fi adev!rat dac! rama dese-
nat! cu caracterul y este deasupra ramei desenate cu caracterul x. Acest tablou se ini#i-
alizeaz! cu fals pentru toate ramele (toate caracterele cu care este posibil! desenarea
unei rame). Vom realiza c!ut!ri pentru fiecare caracter posibil ntre limitele dimensiu-
nilor ramei desenate cu caracterul curent. C!ut!rile trebuie efectuate n ambele direc#ii
(orizontal! "i vertical!).

Subalgoritm Pozi%ii_Relative(peste,minx,miny,maxy,maxy):
pentru c='A','Z' execut":
pentru ch='A','Z' execut":
peste[c,ch] 0 fals { deocamdat! nu am descoperit nici o suprapunere }
sfr!it pentru
sfr!it pentru
pentru c='A','Z' execut": { determin!m suprapunerile }
pentru i=miny[c],maxy[c] execut": { rama desenat! cu caracterul c }
ch 0 a[i,minx[c]] { caracter din desenul ramei desenate cu c }
270 12. Tablouri bidimensionale

dac" ch 1 c atunci { dac! ntlnim ch n desenul ramei desenate cu c }
{ rama desenat! cu ch este deasupra ramei desenate cu c }
peste[c,ch] 0 adev!rat
sfr!it dac"
ch 0 a[i,maxx[c]]
dac" ch 1 c atunci
peste[c,ch] 0 adev!rat
sfr!it dac"
sfr!it pentru
pentru j=minx[c]+1,maxx[c]-1 execut":
ch 0 a[miny[c],j]
dac" ch 1 c atunci
peste[c,ch] 0 adev!rat
sfr!it dac"
ch 0 a[maxy[c],j]
dac" ch 1 c atunci
peste[c,ch] 0 adev!rat
sfr!it dac"
sfr!it pentru
sfr!it pentru
sfr!it subalgoritm

Afi"area n aceast! problem! necesit! cteva verific!ri n plus. De asemenea, va
trebui s! #inem eviden#a ramelor afi"ate deja (n "irul de afi#at, avnd valori booleene),
pentru a evita afi"area lor repetat!. Acest "ir se ini#ializeaz! cu fals. Dac! o ram! nu
are nici una deasupra ei, poate fi ridicat! "i, deci, afi"at!. Vom continua afi"!rile ct
timp mai exist! ram! neafi"at!. Dup! afi"area ramei desenate cu caracterul y, ridicarea
ei va nsemna modificarea valorii lui peste
xy
, care va deveni fals.

Subalgoritm Afi!are(peste,minx,miny,maxx,maxy):
pentru c='A','Z' execut":
{ dac! maxx > 0, nseamn! c! exist! ram! desenat! cu c }
dac" maxx[c] > 0 atunci
deafi!at[c] 0 adev!rat { deci trebuie afi#at! }
altfel
deafi!at[c] 0 false
sfr!it dac"
sfr!it pentru
avemdeafi!at 0 adev!rat
ct timp avemdeafi!at execut": { ct timp avem rame de afi#at, le afi#!m }
avemdeafi!at 0 fals

12. Tablouri bidimensionale 271

pentru c:='A','Z' execut":
dac" deafi!at[c] atunci
ok 0 adev!rat
ch 0 'A'
ct timp ok !i (ch + 'Z') execut":
{ verific!m dac! rama desenat! cu c poate fi ridicat! }
dac" peste[c,ch] atunci
ok 0 fals
sfr!it dac"
ch 0 succesorul lui ch
sfr!it ct timp
dac" ok atunci { dac! da, o afi#!m #i o ridic!m }
scrie c
pentru ch='A','Z' execut":
peste[ch,c] 0 fals
sfr!it dac"
deafi!at[c] 0 fals { nu mai trebuie afi#at! }
avemdeafi!at0 adev!rat
sfr!it dac"
sfr!it dac"
sfr!it pentru
sfr!it ct timp
sfr!it subalgoritm

12.6.8. Prelucrare imagine
ntruct cerin#ele acestei probleme sunt formulate pe subpuncte separate, se descriu n
continuare algoritmi separa#i pentru fiecare transformare n parte. Am notat cu a tablo-
ul bidimensional p!tratic con#innd imaginea, iar cu m dimensiunea acestuia.

A. Inversarea valorilor 0 cu valori 1 #i viceversa
n mod normal, inversarea valorilor se face parcurgnd tabloul, iar dac! elementul are
valoarea 0 aceasta se schimb! n 1 "i invers:
dac" a[i,j] = 1 atunci a[i,j] 0 0
altfel a[i,j] 0 1
Aceast! schimbare de valoare se poate exprima sintetic aplicnd operatorii pe bi#i
astfel: a[i,j] 0 a[i,j] xor 1. Exprim!rile sunt echivalente deoarece:
0 xor 1 = 1 "i 1 xor 1 = 0.

n aceste condi#ii, pseudocodul algoritmului de inversare este urm!torul:



272 12. Tablouri bidimensionale

Subalgoritm Invers(m,a)
pentru i=1,m execut":
pentru j=1,m execut":
a[i,j] 0 a[i,j] xor 1
sfr!it pentru
sfr!it pentru
sfr!it subalgoritm

B. Rotirea tabloului cu 90
0
n sensul acelor de ceasornic
Pentru a roti toate elementele tabloului trebuie s! lu!m pe rnd fiecare element "i s!-l
a"ez!m ntr-un alt tablou bidimensional pe pozi#ia potrivit!. Dezavantajul acestei
variante de algoritm este consumul excesiv de spa#iu de memorie. Se prezint! n
continuare o variant! mai economicoas! care se bazeaz! pe rotirea succesiv! a celor
patru puncte.

a
ij

1
2
3
4

Dac! pentru un element se aranjeaz! patru
elemente la locul lor (folosind o variabil! auxili-
ar!), nseamn! c! trebuie repetat! aceast! opera-
#ie doar pentru o p!trime din elementele tablou-
lui. Se parcurge, de exemplu, numai triunghiul
superior dintre diagonale, inclusiv diagonala
principal!. Elementul a
ij
se salveaz! n variabila
auxiliar! dup! care se efectueaz! cele trei atri-
buiri eviden#iate pe figur!.

Exemple
a
11
a
12
a
13
a
14
m = 5: a
11
a
12
a
13
a
14
a
15

a
21
a
22
a
23
a
24
a
21
a
22
a
23
a
24
a
25

a
31
a
32
a
33
a
34
a
31
a
32
a
33
a
34
a
35

a
41
a
42
a
43
a
44
a
41
a
42
a
43
a
44
a
45

m = 4:
a
51
a
52
a
53
a
54
a
55


) m = 4: a
21
se va nlocui cu a
42
care se va nlocui cu a
34
care se va nlocui cu a
13
.
) m = 5: a
21
se va nlocui cu a
52
care se va nlocui cu a
45
care se va nlocui cu a
14
.

n concluzie, indicele de linie devine indice de coloan!, iar indicele de coloan! ne
ajut! la calcularea noului indice de linie: m fostul indice coloan! + 1.

n ceea ce prive"te parcurgerea triunghiului dintre diagonalele tabloului (f!r! ele-
mentele de pe diagonala secundar!): indicele de linie variaz! ntre prima linie "i linia
de mijloc (sau deasupra mijlocului atunci cnd dimensiunea tabloului este par!), iar
indicele de coloan! porne"te de la elementul de pe diagonala principal! i "i cre"te pn!
la m i.
12. Tablouri bidimensionale 273

a
11
a
12
a
13
a
14
m = 5: a
11
a
12
a
13
a
14
a
15

a
21
a
22
a
23
a
24
a
21
a
22
a
23
a
24
a
25

a
31
a
32
a
33
a
34
a
31
a
32
a
33
a
34
a
35

a
41
a
42
a
43
a
44
a
41
a
42
a
43
a
44
a
45

m = 4:
a
51
a
52
a
53
a
54
a
55


Prezent!m n continuare pseudocodul corespunz!tor algoritmului descris.

Subalgoritm Rote!te(m,a):
pentru i=1,[m/2] + rest[m/2] execut":
pentru j=i,M-i execut": { pentru o p!trime din elementele tabloului }
i1 0 i
j1 0 j
aux 0 a[i,j] { se p!streaz! elementul de pornire }
pentru k=1,3 execut":
i2 0 m - j1 + 1 { se ini"ializeaz! indicii de unde se ia valoarea }
j2 0 i1
a[i1,j1] 0 a[i2,j2] { mutare }
i1 0 i2 { se ini"ializeaz! indicii unde se va pune valoarea }
j1 0 j2 { la urm!toarea itera"ie }
sfr!it pentru
a[i2,j2] 0 aux
sfr!it pentru
sfr!it pentru
sfr!it subalgoritm

C. Dublarea imaginii (Zoom)
Pentru a extinde tabloul pe un tablou de dou! ori mai mare se vor construi n noul
tablou cte patru elemente cu acea valoare, a"ezate n forma unei matrice p!tratice de
dimensiune 2.
De exemplu, un element avnd valoarea 1 n matricea ini#ial! se nlocuie"te cu:
1 1
0 1
Ne propunem n continuare s! determin!m modalitatea n care se ob#in indicii ele-
mentelor matricei m!rite din matricea ini#ial!.

indici de linie: 1 2 3 4
indici de linie: 1 2 1 1 1 0 0
1 1 0 2 1 1 0 0 indici de
coloan!: 2 0 1 3 0 0 1 1

indici de
coloan!:
4 0 0 1 1
Elementului a
11
i corespund elementele a
11
, a
12
, a
21
, a
22
. Elementului a
12
i cores-
pund elementele a
13
, a
14
, a
23
, a
24
. Generaliznd cele observate, elementului a
ij
i cores-
pund elementele a
2i 1, 2j 1
, a
2i 1, 2j
, a
2i, 2j 1
, a
2i, 2j
.
274 12. Tablouri bidimensionale

Subalgoritm Zoom(m,a):
pentru i=1,m execut":
pentru j=1,m execut":
b[2*i-1,2*j-1] 0 a[i,j] { b tablou auxiliar }
b[2*i-1,2*j] 0 a[i,j]
b[2*i,2*j-1] 0 a[i,j]
b[2*i,2*j] 0 [i,j]
sfr!it pentru
sfr!it pentru
m 0 2*m
a 0 b { atribuire la nivel de tablou, suprascriem vechiul a cu b }
sfr!it subalgoritm

n algoritmul care va apela subalgoritmii prezenta#i am notat cu transformare ca-
racterul care con#ine codul transform!rii curente.
Algoritm Prelucrare:
... { se citesc dimensiunea #i elementele tabloului dat }
ct timp nu s-a ajuns la sfr#itul fi#ierului execut":
cite!te transformare
dac" transformare = 'I' atunci
Invers(m,a)
altfel
dac" transformare = 'R' atunci
Rote!te(m,a)
altfel
dac" transformare = 'Z' atunci
Zoom(m,a)
sfr!it dac"
sfr!it dac"
sfr!it dac"
sfr!it ct timp
... { se afi#eaz! tabloul bidimensional ob"inut }
sfr!it algoritm

12.6.9. Careu Magic
Algoritmul de rezolvare a acestei probleme ncepe prin a testa dimensiunea careului de
generat. n func#ie de proprietatea pe care acest num!r o are: impar, par multiplu de 4
sau par f!r! a fi multiplu de 4, aplic!m algoritmul prezentat la teorie.
S! urm!rim descrierea implement!rilor pentru fiecare dintre cei trei algoritmi.

a. Drumul mp"ratului Ven sau generarea p"tratelor magice de ordin impar
Descriem n continuare o variant! de generare a unui p!trat magic de ordin impar care
respect! drumul mp!ratului Ven. Careul magic l gener!m n tabloul a. Algoritmul
12. Tablouri bidimensionale 275

atribuie pe rnd valorile cuprinse n intervalul [1, n
2
] variabilei nr, urmnd ca aceast!
valoare s! se atribuie elementelor careului pe baza regulilor precizate.

Subalgoritm Ven:
y 0 n
x 0 [(n+1)/2]
nr 0 1
pentru i=1,n execut":
a[y,x] 0 nr
pentru j=1,n-1 execut":
dac" x = 1 atunci
x 0 n
altfel
x 0 x 1
sfr!it dac"
dac" y = 1 atunci
y 0 n
altfel
y 0 y 1
sfr!it dac"
nr 0 nr + 1
a[y,x] 0 nr
sfr!it pentru
dac" y = n atunci
y 0 1
altfel
y 0 y + 1
sfr!it dac"
nr 0 nr + 1
sfr!it pentru
sfr!it subalgoritm

b. Careul magic de dimensiune par" (n = 4 , m)
Pentru a genera careul magic de dimensiune par!, pornim de la matricea de ordin n
format! cu numerele 1, 2, , n
2
a"ezate n ordine pe linii.
Din descrierea algoritmului se desprinde c! elementele aflate pe linii avnd num!r
de ordine pentru care restul mp!r#irii la 4 este 0 sau 1 "i coloane care nu au aceast!
proprietate sau pe coloane avnd num!r de ordine pentru care restul mp!r#irii la 4 este
0 sau 1 "i linii care nu au aceast! proprietate trebuie schimbate cu elementele aflate n
pozi#ii simetrice fa#! de mijlocul careului. Aceast! proprietate privind pozi#ia elemen-
tului o vom exprima folosind operatorul logic xor. Schimbarea cu elementul simetric
se asigur! folosind valoarea variabilei nn.
276 12. Tablouri bidimensionale

Subalgoritm Magic4M:
nr 0 1
nn 0 n*n + 1
pentru i=1,n execut":
pentru j=1,n execut":
dac" (rest[i/4] + 1) xor (rest[j/4] + 1) atunci
a[i,j] 0 nn - nr
altfel
a[i,j] 0 nr
sfr!it dac"
nr 0 nr + 1
sfr!it pentru
sfr!it pentru
sfr!it subalgoritm

c. P"trat magic de ordin n, unde n = 2 , m #i m este num"r impar
S! urm!rim pa"ii algoritmului de generare a unui p!trat magic de ordin n, unde n = 2 , m
"i m este num!r impar. Trebuie s! mp!r#im careul n careuri mici de dimensiune 2 , 2,
asupra c!rora decidem n ce form! se vor completa. Aceast! form! se stabile"te n
subalgoritmul Forma(x,y,nr), apelat de subalgoritmul urm!tor:

Subalgoritm CareuMagic2M:
n 0 [n/2]
y 0 1
x 0 [(n+1)/2]
nr 0 1
pentru i=1,n execut":
Forma(x,y,nr)
pentru j=1,n-1 execut":
dac" x = 1 atunci
x 0 n
altfel
x 0 x - 1
sfr!it dac"
dac" y = 1 atunci
y 0 n
altfel
y 0 y - 1
sfr!it dac"
Forma(x,y,nr)
sfr!it pentru
dac" y = n atunci
y 0 1
12. Tablouri bidimensionale 277

altfel
y 0 y + 1
sfr!it dac"
sfr!it pentru
n 0 n*2
sfr!it subalgoritm

Subalgoritm Forma(x,y,nr):
dac" y > [n/2] + 2 atunci
FormaX(x,y,nr) { XXXXX }
altfel
dac" y = [n/2] + 2 atunci { UULUU }
dac" x = [(n+1)/2] atunci
FormaL(x,y,nr)
altfel
FormaU(x,y,nr)
sfr!it dac"
altfel
dac" y = [n/2] + 1 atunci { LLULL }
dac" x = [n/2] + 1 atunci
FormaU(x,y,nr)
altfel
FormaL(x,y,nr)
sfr!it dac"
altfel
FormaL(x,y,nr) { LLLLL }
sfr!it dac"
sfr!it dac"
sfr!it dac"
nr 0 nr + 4
sfr!it subalgoritm

Subalgoritm FormaL(x,y,nr):
a[2*y-1,2*x-1] 0 nr + 2
a[2*y-1,2*x ] 0 nr + 1
a[2*y ,2*x-1] 0 nr
a[2*y ,2*x ] 0 nr + 3
sfr!it subalgoritm

Subalgoritm FormaU(x,y,nr):
a[2*y-1,2*x-1] 0 nr + 2
a[2*y-1,2*x ] 0 nr + 1
a[2*y ,2*x-1] 0 nr + 3
a[2*y ,2*x ] 0 nr
sfr!it subalgoritm
278 12. Tablouri bidimensionale

Subalgoritm FormaX(x,y,nr):
a[2*y-1,2*x-1] 0 nr + 1
a[2*y-1,2*x ] 0 nr + 2
a[2*y ,2*x-1] 0 nr + 3
a[2*y ,2*x ] 0 nr
sfr!it subalgoritm