Sunteți pe pagina 1din 92

Probleme rezolvate de programare Subiecte propuse la ATESTAT

ATESTAT - 2003 - 1 - Se citesc numere naturale pn la


introducerea a dou numere consecutive egale. Afiai toate
perechile de numere citite consecutiv, care sunt prime
ntre ele..
Rezolvare:
Dou numere naturale A i B, diferite de 0, sunt prime
ntre ele dac l au pe 1 ca singur divizor comun.
Altfel spus, CMMDC al celor dou numere este egal cu
1. Nu este obligatoriu ca A i B s fie ele nsele prime.
Exemplu: 15 i 16 NU sunt numere prime, dar sunt
prime ntre ele, pentru c CMMDC (15, 16) = 1.
Conform enunului, dac se citesc numere, nu se tie
de la nceput cte (nu se d un n = numrul de
numere ce se vor citi), deci va trebui s le numrm cu
un contor i.
Numerele pe care le vom introduce vor fi preluate ntr-
un vector X.
Definim o funcie CMMDC pentru a calcula CMMDC
al dou numere consecutive (cele dou numere vor fi
dou elemente consecutive din vectorul X).
Program ATESTAT_2003_1_NUMERE_PRIME_INTRE_ELE ;
CONST
nmax = 100;
TYPE
vect or = ar r ay [ 1. . nmax] of i nt eger ;
VAR
x : vect or ;
n, i : i nt eger ;
function CMMDC ( A, B : i nt eger ) : i nt eger ;
var
aux, R : i nt eger ;
begi n
i f A < B t hen
begi n
aux : = A;
A : = B;
B : = aux
end;
Probleme rezolvate de programare Subiecte propuse la ATESTAT
4
R : = A MOD B;
whi l e R <> 0 do
begi n
A : = B;
B : = R;
R : = A MOD B
end;
CMMDC : = B
end; { sf ar si t f unct i e CMMDC }
Begin { PROGRAM PRINCIPAL }
i := 1; {cont or car e
numar a numer el e i nt r oduse}
wr i t e ( ' Dat i x [ ' , i , ' ] = ' ) ;
{i nt r oducempr i mul numar }
r eadl n ( x [ i ] ) ;
REPEAT
{i nt r oducemur mat oar el e numer e}
i : = i + 1;
wr i t e ( ' Dat i x [ ' , i , ' ] = ' ) ;
r eadl n ( x [ i ] ) ;
UNTI L ( x [ i ] = x [ i - 1] ) ; {pana ce
apar doua numer e consecut i ve egal e}
n := i; {n = t ot al
numer e i nt r oduse = i }
f or i : = 1 t o n - 1 do
begi n
i f CMMDC ( x [i], x [i+1] ) = 1
t hen
wr i t el n ( x [ i ] , ' si ' , x
[ i +1] , ' sunt pr i me i nt r e el e' ) ;
end;
r eadl n
end.
Probleme rezolvate de programare Subiecte propuse la ATESTAT
5
ATESTAT - 2003 - 2 - Se citesc numere naturale pn la
introducerea unui numr prim cu 12. Afiai toate
numerele care sunt prime cu suma cifrelor lor.
Rezolvare:
Dou numere sunt prime ntre ele dac CMMDC al celor
dou numere este 1 (vezi problema anterioar).
Introducem primul numr, notat cu x. Verificm dac x
este prim cu 12 i dac DA, oprim algoritmul; dac nu,
verificm dac este prim cu suma cifrelor sale.
Pentru c vom introduce mai multe numere, dar nu tim de la
nceput cte anume, introducerea urmtoarelor numere se va
face ntr-un ciclu WHILE.
Definim o funcie CMMDC pentru a calcula CMMDC al
dou numere.
Definim o funcie NUMARACIFRE, pentru a numra
cifrele unui numr natural.
Definim o procedur DETCIFRE, care determin cifrele
unui numr i le depune ntr-un vector.
Definim o funcie SUMACIFRE, care nsumeaz cifrele
unui numr.
Program
ATESTAT_2003_2_NUMERE_PRIME_CU_SUMA_CIFRELOR_LOR
;
CONST
nmax = 100;
TYPE
vect or = ar r ay [ 1. . nmax] of i nt eger ;
VAR
y : vect or ;
S, x, n, i : i nt eger ;
function CMMDC ( A, B : i nt eger ) : i nt eger ;
var
aux, R : i nt eger ;
begi n
i f A < B t hen
begi n
aux : = A;
A : = B;
Probleme rezolvate de programare Subiecte propuse la ATESTAT
6
B : = aux
end;
R : = A MOD B;
whi l e R <> 0 do
begi n
A : = B;
B : = R;
R : = A MOD B
end;
CMMDC : = B
end; { sf ar si t f unct i e CMMDC }
function NUMARACIFRE ( z : i nt eger ) : i nt eger ;
var
nr ci f : i nt eger ;
begi n
i f z = 0 t hen
nr ci f : = 1
el se
begi n
nr ci f : = 0;
whi l e z > 0 do
begi n
z := z DIV 10;
nrcif := nrcif + 1
end;
end;
NUMARACI FRE : = nr ci f ;
end; { sf ar si t f unct i e NUMARACI FRE }
Probleme rezolvate de programare Subiecte propuse la ATESTAT
7
procedure DETCIFRE ( z : i nt eger ; VAR y :
vect or ) ;
{ det er mi na ci f r el e l ui
z si l e depune i n vect or ul y }
begi n
n : = NUMARACI FRE ( z ) ;
i : = n;
whi l e i >= 1 do
begi n
y [ i ] := z MOD 10;
z := z DIV 10;
i := i - 1
end;
end; { sf ar si t pr oc. DETCI FRE }
function SUMACIFRE ( z : i nt eger ) :
i nt eger ;
var
s : i nt eger ;
begi n
DETCIFRE ( z, y );
S : = 0;
f or i : = 1 t o n do
begi n
S : = S + y [ i ]
end;
SUMACI FRE : = S;
end; { sf ar si t f unct i e SUMACI FRE }
Begin { PROGRAM PRINCIPAL }
wr i t e ( ' Dat i x = ' ) ; {I nt r oducer ea
primului numr}
r eadl n ( x ) ;
while CMMDC ( x, 12 ) <> 1 do {testm
dac x este prim cu 12}
begi n
S : = SUMACIFRE ( x) ;
Probleme rezolvate de programare Subiecte propuse la ATESTAT
8
i f CMMDC ( x, S) = 1 t hen
wr i t el n ( ' x = ' , x, ' est e pr i mcu
suma ci f r el or sal e S = ' , s)
el se
wr i t el n ( ' x = ' , x, ' NU est e pr i m
cu suma ci f r el or sal e S = ' , s) ;
wr i t e ( ' Dat i x = ' ) ;
{Introducerea urmtoarelor numere}
r eadl n ( x ) ;
end;
r eadl n;
end.
ATESTAT - 2003 - 3 - Fie x un numr natural. Stabilii
care este factorul prim care, n descompunerea lui x, apare
la puterea maxim.
Rezolvare:
Notm cu d un posibil divizor al lui x. Evident, d
poate lua valori consecutive ncepnd de la 2 pn la x,
dar nu orice valoare ntre 2 i x este i divizor al lui x.
Contorul nr numr de cte ori x se mparte exact la
un d >=2.
Dup fiecare mprire exact a lui x la d, noul x devine
x DIV d. Repetm (ntr-un ciclu WHILE) aceste
calcule att timp ct x > 1.
Probleme rezolvate de programare Subiecte propuse la ATESTAT
9
Plecm cu d de la valoarea 2 i nu de la 1, pentru a evita
un ciclu infinit n urma atribuirii x := x DIV d.
Dac s-ar iniializa d cu 1, n urma atribuirii x := x DIV
d, noua valoare a lui x ar rmne ntotdeauna = x, deci
divizorul d = 1 s-ar numra de o infinitate de ori
(gsindu-l pe 1 ca divizor de o infinitate de ori, nu s-ar
mai trece niciodat la d =2, prin atribuirea d := d + 1).
Reinem n variabila max cel mai mare numr de
mpriri ale lui x la un divizor d.
Notm cu divizor divizorul pentru care numrul de
mpriri este max.
Program ATESTAT_2003_3 ; {determin divizorul
care apare la puterea maxim }
VAR
x, d, nr , MAX, di vi zor : i nt eger ;
Begin { PROGRAM PRINCIPAL }
wr i t e ( ' Dat i x = ' ) ;
r eadl n ( x) ;
d : = 2; {pr i mul di vi zor posi bi l }
max : = 0; {i ni t i al i zar e MAX}
nr : = 0; {i ni t i al i zar e numar de i mpar t i r i
al e l ui x l a d}
whi l e x > 1 do
begi n
I f x MOD d = 0 t hen {daca x se
i mpar t e l a d}
begi n
nr : = nr + 1;
x : = x DI V d;
i f max < nr t hen
begi n
max : = nr ;
wr i t el n ( ' Di vi zor ul
' , d, ' apar e de ' , max, ' or i ' ) ;
di vi zor : = d;
Probleme rezolvate de programare Subiecte propuse la ATESTAT
10
end
end
el se
begi n
d : = d + 1;
nr : = 0
end;
end;
wr i t el n;
wr i t el n ( ' Di vi zor ul ' , divizor, ' apar e l a
put er ea maxi ma = ' , max) ;
r eadl n
end.
ATESTAT - 2003 - 4 - Se citesc pe rnd n numere
naturale. Afiai-le pe cele care sunt termeni ai irului lui
Fibonacci.
Rezolvare:
Presupunem c numerele x NU sunt introduse n
ordine.
Folosim o bucl exterioar n care introducem cte un
x.
Folosim o bucl interioar n care generm un nou
termen FIBONACCI, ct timp numrul x introdus
rmne > termenul FIBONACCI generat.
Termenii irului FIBONACCI se rein n vectorul
FIBO.
Probleme rezolvate de programare Subiecte propuse la ATESTAT
11
Program ATESTAT_2003_4_Fibonacci ;
CONST
nmax = 100;
TYPE
vect or = ar r ay [ 1. . nmax] of i nt eger ;
VAR
FI BO : vect or ;
x, n, i , j : i nt eger ;
Begin { PROGRAM PRINCIPAL }
wr i t e ( ' Dat i nr . de numer e nat ur al e, n =
' ) ;
r eadl n ( n ) ;
f or i : = 1 t o n do {bucla exterioar}
begi n
wr i t e ( ' Dat i x = ' ) ;
r eadl n ( x) ;
FI BO [ 1] : = 1;
{iniializarea primilor termeni ai
irului}
FI BO [ 2] : = 1;
j : = 3;
whi l e x > FI BO [ j ] do {bucl a
interioar}
begi n
FI BO [ j ] : = FI BO [ j - 1] +
FI BO [ j - 2] ;
j : = j + 1
end; {sf ar si t
bucla interioar}
i f x = FI BO [ j ] t hen
wr i t el n ( ' x = ' , x, ' est e
t er men FI BO' )
el se
wr i t el n ( ' x = ' , x, ' NU est e
t er men FI BO' )
Probleme rezolvate de programare Subiecte propuse la ATESTAT
12
end; {sf ar si t bucl a
exterioar}
r eadl n
end.
ATESTAT - 2003 - 5 - Se citesc pe rnd n numere
naturale. Afiai perechile de numere citite succesiv, care
sunt termeni ai irului lui Fibonacci.
Rezolvare:
Definim funcia VERIFICA, pentru a testa dac un
numr este termen FIBONACCI.
Numerele pe care le introducem se vor reine ntr-un
vector x.
Pentru introducerea vectorului, definim procedura
CITESTEVECTOR.
Program ATESTAT_2003_5_Fibonacci ;
CONST
nmax = 100;
TYPE
vect or = ar r ay [ 1. . nmax] of i nt eger ;
VAR
x, FI BO : vect or ;
n, i , j : i nt eger ;
Probleme rezolvate de programare Subiecte propuse la ATESTAT
13
function VERIFICA ( z : i nt eger ) : BOOLEAN;
var
OK : BOOLEAN;
begi n
OK : = FALSE;
FI BO [ 1] : = 1;
FI BO [ 2] : = 1;
i f ( z = 1) t hen
OK : = TRUE;
j := 3;
whi l e z > FI BO [ j ] do
begi n
FI BO [ j ] : = FI BO [ j - 1] + FI BO
[ j - 2] ;
j : = j + 1
end;
i f z = FI BO [ j ] t hen
OK : = TRUE;
VERI FI CA : = OK;
end; { sf ar si t f unct i e VERI FI CA }
procedure CITESTEVECTOR ( VAR v : vect or ; n :
i nt eger ) ;
begi n
f or i : = 1 t o n do
begi n
wr i t e ( ' Dat i x [ ' , i , ' ] =
' ) ;
r eadl n ( v [ i ] ) ;
end;
end;
Begin { PROGRAM PRINCIPAL }
wr i t e ( ' Dat i nr . de numer e nat ur al e, n = ' ) ;
r eadl n ( n ) ;
CITESTEVECTOR ( x, n) ;
Probleme rezolvate de programare Subiecte propuse la ATESTAT
14
f or i : = 1 t o n- 1 do
begi n
i f ( VERI FI CA ( x[ i ] ) = TRUE ) AND (
VERI FI CA ( x[ i +1] ) = TRUE ) t hen
wr i t el n ( x [ i ] , ' si ' , x [ i +
1 ] , ' sunt t er meni FI BO' )
el se
wr i t el n ( x [ i ] , ' si ' , x [ i +
1 ] , ' NU sunt t er meni FI BO' ) ;
end;
r eadl n
end.
ATESTAT - 2003 - 6 - S se genereze toate numerele de 5
cifre care au doar cifre pare i sunt divizibile cu 13.
Rezolvare:
Notm cu a, b, c, d, e cifrele numrului x.
Verificarea se va face pentru toate numerele x cuprinse
ntre 20000 i 88888.
Se definete o funcie CIFREPARE, care verific dac
toate cifrele numrului x sunt pare.
Probleme rezolvate de programare Subiecte propuse la ATESTAT
15
Program ATESTAT_2003_6 ;
VAR
x, y, z, t , u, v, a, b, c, d, e : l ongi nt ;
function CIFREPARE( z : i nt eger ) : BOOLEAN;
begi n
e : = x MOD 10;
y : = x DI V 10;
d : = y MOD 10;
z : = y DI V 10;
c : = z MOD 10;
t : = z DI V 10;
b : = t MOD 10;
v : = t DI V 10;
a : = v MOD 10;
i f ( a MOD 2 = 0) AND ( b MOD 2 = 0) AND
( c MOD 2 = 0)
AND ( d MOD 2 = 0) AND ( e MOD 2 = 0)
t hen
CI FREPARE : = TRUE
ELSE
CI FREPARE : = FALSE;
end; { sf ar si t f unct i e CI FREPARE }
Begin { PROGRAM PRINCIPAL }
f or x : = 20000 t o 88888 do
begi n
i f ( CI FREPARE ( x) = TRUE ) AND ( x MOD 13
= 0 ) t hen
begi n
wr i t el n ( ' x = ' , x, ' ar e t oat e
ci f r el e par e si se di vi de l a 13' ) ;
wr i t el n ( ' Apasat i ENTER' ) ;
r eadl n
end;
end;
r eadl n
end.
ATESTAT - 2003 - 7 - S se genereze toate numerele de 6
cifre, care au cifrele ordonate descresctor, prima i
ultima cifr fiind impare.
Probleme rezolvate de programare Subiecte propuse la ATESTAT
16
Rezolvare:
Notm cu a, b, c, d, e, f cifrele numrului x.
Definim funcia VERIFICA (x), care determin cifrele
lui x si apoi face verificrile impuse de problem.
Numerele testate sunt cuprinse ntre 987653 i 654321.
Program ATESTAT_2003_7 ;
VAR
x, y, z, t , u, v, w, a, b, c, d, e, f :
l ongi nt ;
function VERIFICA ( z : l ongi nt ) : BOOLEAN;
begi n
f : = x MOD 10; {det er mi nar ea ci f r el or
l ui x}
y : = x DI V 10;
e : = y MOD 10;
z : = y DI V 10;
d : = z MOD 10;
t : = z DI V 10;
c : = t MOD 10;
v : = t DI V 10;
b : = v MOD 10;
w : = v DI V 10;
a : = w MOD 10;
Probleme rezolvate de programare Subiecte propuse la ATESTAT
17
i f ( a > b) AND ( b >c) AND ( c >d)
AND ( d >e) AND ( e >f ) t hen
begi n
i f ( a MOD 2 <> 0 ) AND ( f
MOD 2 <> 0) t hen
VERI FI CA : = TRUE
el se
VERI FI CA : = FALSE
end
el se
VERI FI CA : = FALSE;
end; { sf ar si t f unct i e VERI FI CA }
Begin { PROGRAM PRINCIPAL }
f or x : = 987653 downt o 654321 do
begi n
i f VERI FI CA ( x) = TRUE t hen
begi n
wr i t el n ( ' x = ' , x ) ;
wr i t el n ( ' Apasat i ENTER' ) ;
r eadl n
end;
end;
r eadl n
end.
ATESTAT - 2003 - 8 - S se determine toate cuvintele de
5 litere ce conin mcar dou vocale i au a 2-a liter m.
Rezolvare:
Generm cuvintele folosind un ir de caractere
cuvant de lungime =5.
Pe poziia 2 din cuvant va fi ntotdeauna litera m,
deci cuvant [2] := 'm'.
Pe celelalte 4 poziii (1, 3, 4, 5) din cuvant vom plasa
consoane i vocale. Pentru aceasta, folosim 4 bucle
FOR n care contorii de tip CHAR vor fi chiar
Probleme rezolvate de programare Subiecte propuse la ATESTAT
18
elementele irului cuvant de pe poziiile 1, 3, 4, 5
(cuvant [1], cuvant [3], cuvant [4], cuvant [5]), care
vor lua valori de tip CHAR de la a la z.
Pentru fiecare poziie din irul cuvant testm dac pe
poziia respectiv se afl o vocal i dac DA,
numrm acea vocal, folosind contorul nrvocale.
Dup generarea unei combinaii de vocale i consoane
care compun un cuvnt (la sfritul buclei FOR de la
interior), testm dac nrvocale >= 2 i dac DA,
numrm cuvntul care satisface condiiile problemei
(majorm contorul i) i afim cuvntul.
La nceputul buclei FOR situate cel mai interior,
trebuie s iniializm, de fiecare dat, contorul care
numr vocalele, scriind nrvocale := 0;
Program ATESTAT_2003_8 ;
uses cr t ;
var
cuvant : st r i ng;
i , nr vocal e : i nt eger ;
Begin { PROGRAM PRINCIPAL }
i := 0; {i = cont or car e numr
cuvi nt el e pe car e l e vomgener a}
cuvant [2] := 'm';
Probleme rezolvate de programare Subiecte propuse la ATESTAT
19
f or cuvant [ 1] : = ' a' t o ' z' do
begi n
f or cuvant [ 3] : = ' a' t o ' z' do
begi n
f or cuvant [ 4] : = ' a' t o ' z' do
begi n
f or cuvant [ 5] : = ' a' t o ' z' do
begi n
nrvocale := 0; {contor
ce numr vocalele di n cuvant}
i f cuvant [ 1] I N
[ ' a' , ' e' , ' o' , ' i ' , ' u' ] t hen
nr vocal e : =
nr vocal e + 1;
i f cuvant [ 3] I N
[ ' a' , ' e' , ' o' , ' i ' , ' u' ] t hen
nr vocal e : =
nr vocal e + 1;
i f cuvant [ 4] I N
[ ' a' , ' e' , ' o' , ' i ' , ' u' ] t hen
nr vocal e : =
nr vocal e + 1;
i f cuvant [ 5] I N
[ ' a' , ' e' , ' o' , ' i ' , ' u' ] t hen
nr vocal e : =
nr vocal e + 1;
i f nr vocal e >= 2 t hen
begi n
i := i + 1;
wr i t el n ( ' i =
' , i ) ;
wr i t el n
( ' cuvant ul = ' , cuvant [ 1] , cuvant [ 2] ,
cuvant [ 3] , cuvant [ 4] , cuvant [ 5] ) ;
end;
r eadl n
end
end;
end;
end;
r eadl n
end.
Probleme rezolvate de programare Subiecte propuse la ATESTAT
20
ATESTAT - 2003 - 9 - S se afieze toate matricile
ptratice n x n care conin pe fiecare linie i coloan un
singur 1, n rest 0.
Rezolvare:
Aceast problem este asemntoare cu problema
celor n regine, pe care o vom adapta la cerinele de mai
sus. Asociem unei regine o cifr de 1. Problema reginelor
cere s se plaseze n regine pe o tabl de ah de dimensiune
n x n, astfel nct oricare dou regine s nu se atace.
Pentru ca dou regine s nu se atace, ele trebuie s nu fie
situate pe aceeai linie, pe aceeai coloan sau pe aceeai
diagonal. La noi, rolul reginelor va fi jucat de elementele
egale cu 1 din matricea ptratic n x n. n cazul problemei
noastre, vom renuna la cerina ca elementele matricii egale
cu 1 s nu fie plasate pe aceeai diagonal. Pe fiecare linie
trebuie s fie plasat cte o regin. Deci, pentru ca poziia
reginelor s fie complet determinat, este suficient s reinem,
pentru fiecare regin, coloana n care este plasat, ntr-un
vector soluie f, de dimensiune n, unde f [i] reprezint
coloana n care este plasat regina de pe linia i. Generarea
matricilor n condiiile problemei se face apelnd la un
algoritm backtracking.
Observaii:
Notm cu x, respectiv i o linie oarecare i cu f [x],
respectiv f [i], coloana pe care se gsete regina de pe linia
x, respectiv linia i.
Condiiile interne:
a). f [x] =1, 2, ..., n, pentru oricare x =1, 2, ..., n
b). Dou regine nu pot fi plasate pe aceeai coloan se va
exprima analitic astfel:
f [x] f [y] pentru orice x y, cu x, y = 1, 2,...,n.
Definim o procedur AFIARE astfel:
Probleme rezolvate de programare Subiecte propuse la ATESTAT
21
n momentul apelrii procedurii, este evident c s-a
gsit o soluie pe care o numrm scriind:
Nrsol := Nrsol + 1
i apoi afim Nrsol.
Vom parcurge toate coloanele de la 1 la n. Pentru
aceasta avem nevoie de un contor poziional col care va lua
valori de la 1 la n.
n procedur, col este o coloan curent, iar f [lin]
este tot o coloan, i anume coloana pe care se gsete regina
de pe linia lin.
Procedura va tipri " * " dac pe coloana curent col
exist o regin, adic atunci cnd col = f [lin], i va
tipri "o" dac aceast condiie nu este satisfcut.
Program ATESTAT_2003_9 ;
uses cr t ;
const
nrmaxregine = 8; {8 sau alt valoare}
t ype
vect or sol ut i e = ar r ay [ 0. . nr maxr egi ne] of
0. . nr maxr egi ne;
var
f : vect or sol ut i e;
n, x, i : 0 . . nr maxr egi ne;
ok : bool ean;
nr sol : wor d;
procedure AFISARE;
var
i , j : 0 . . nr maxr egi ne;
begi n
nr sol : = nr sol + 1;
wr i t el n;
wr i t el n ( ' Sol ut i a nr . ' , nr sol ) ;
f or i : = 1 t o n do
begi n
f or j : = 1 t o n do
begi n
i f j = f [ i ] t hen
wr i t e ( ' 1 ' )
el se
Probleme rezolvate de programare Subiecte propuse la ATESTAT
22
wr i t e ( ' o ' )
end;
wr i t el n;
end;
wr i t el n;
r eadl n
end; { sf ar si t pr ocedur a }
Begin { PROGRAM PRINCIPAL }
cl r scr ;
wr i t e ( ' I nt r oducet i numar ul de pat r at el e n
= ' ) ;
r eadl n ( n) ;
nr sol : =0;
x : = 1; { vi r f ul st i vei }
f [ x] : = 0;
whi l e x > 0 do { ci t t i mp st i va nu est e
vi da }
begi n
whi l e f [ x] < n do { ci t t i mp
exi st a val or i di sponi bi l e }
begi n
f [ x] : = f [ x] + 1;
ok : = t r ue;
Probleme rezolvate de programare Subiecte propuse la ATESTAT
23
f or i : = 1 t o x - 1 do
begi n
i f ( f [ i ] = f [ x] ) t hen
begi n
ok : = f al se;
end
end;
i f ok = t r ue t hen { val oar ea
est e val i da }
begi n
i f x = n t hen { st i va
est e pl i na }
AFISARE
el se
begi n
x := x + 1;
{PAS INAINTE}
f [ x] : = 0
end;
end;
end; { sf ar si t WHI LE i nt er i or }
x := x 1
{PAS INAPOI}
end; { sf ar si t WHI LE ext er i or }
r eadl n
end.
ATESTAT - 2003 - 10 - S se genereze toate permutrile
mulimii {1, 2,... n} cu condiia ca orice dou numere
alturate ale unei permutrii s fie prime ntre ele.
Rezolvare:
Definim o funcie CMMDC pentru a calcula CMMDC
al dou numere.
Funcia CMMDC va fi apelat n procedura
PERMUT, pentru a se testa dac dou numere
alturate ale unei permutri sunt prime ntre ele. Cu
excepia acestei verificri impuse de enunul problemei
Probleme rezolvate de programare Subiecte propuse la ATESTAT
24
de fa, procedura PERMUT are acelai coninut ca i
cel de la generarea permutrilor de ordinul n.
Program ATESTAT_2003_10_PERMUTARI ;
uses cr t ;
const
nmax = 100;
t ype
vect or = ar r ay [ 1. . nmax] of i nt eger ;
var
f : vect or ;
sol , n, i : i nt eger ;
OK : bool ean;
function CMMDC ( A, B : i nt eger ) : i nt eger ;
var
aux, R : i nt eger ;
begi n
i f A < B t hen
begi n
aux : = A;
A : = B;
B : = aux
end;
Probleme rezolvate de programare Subiecte propuse la ATESTAT
25
R : = A MOD B;
whi l e R <> 0 do
begi n
A : = B;
B : = R;
R : = A MOD B
end;
CMMDC : = B
end; { sf ar si t f unct i e CMMDC }
procedure VERIFICA ( k : i nt eger ; f : vect or ;
VAR CONTI N : bool ean ) ;
LABEL
10;
begi n
CONTI N : = TRUE;
f or i : = 1 t o k - 1 do
begi n
i f f [ i ] = f [ k] t hen
begi n
CONTI N : = FALSE;
GOTO 10
end;
end;
10:
end;
procedure SCRIE ;
begi n
sol : = sol + 1;
wr i t e ( ' Sol ut i a nr . ' , sol , ' ' ) ;
f or i : = 1 t o n do
begi n
wr i t e ( f [ i ] : 3 )
end;
wr i t el n
end;
procedure PERMUTA ( m: i nt eger ) ;
LABEL
20;
Probleme rezolvate de programare Subiecte propuse la ATESTAT
26
var
k : i nt eger ;
CONTI N : bool ean;
Begi n {nceput procedur PERMUTA}
k : = 1;
f [ k] : = 0;
whi l e k > 0 do
begi n
CONTI N : = FALSE;
whi l e f [ k] < mdo
begi n
f [ k] : = f [ k] + 1;
VERIFICA ( k, f , CONTI N) ;
i f CONTI N = TRUE t hen
GOTO 20
end;
20: i f ( CONTI N = TRUE ) AND ( k = n)
t hen
begi n
OK : = TRUE;
Probleme rezolvate de programare Subiecte propuse la ATESTAT
27
f or i : = 1 t o n - 1 do
begi n
i f CMMDC ( f[i],
f[i-1] ) <> 1 t hen
OK : = FALSE
end;
i f OK = TRUE t hen
SCRIE;
end;
i f ( CONTI N = TRUE ) and ( k < n)
t hen
begi n
k : = k + 1;
f [ k] : = 0
end;
i f CONTI N = FALSE t hen
k : = k - 1
end; {sfrit WHILE exterior}
end; {sfrit procedur PERMUTA}
Begin { PROGRAM PRINCIPAL }
cl r scr ;
sol : = 0;
wr i t e( ' Dat i n = ' ) ;
r eadl n ( n) ;
wr i t el n;
PERMUTA (n);
i f sol = 0 t hen
wr i t el n ( ' Nu exi st a sol ut i e' ) ;
r eadl n
end.
Probleme rezolvate de programare Subiecte propuse la ATESTAT
28
ATESTAT - 2003 - 11 - S se genereze toate variantele de
punctaje ce aparin {1, 2,... 10} obinute la n examene,
astfel nct punctajul obinut s fie minim.
Rezolvare:
Generarea combinaiilor de note se face dup algoritmul
BACKTRACKING.
Folosim un vector max n care memorm nota maxim
obinut la fiecare din cele n examene. Evident, vectorul
max va avea n elemente.
n algoritmul de generare a produsului cartezian din
lucrarea amintit, am notat cu f [x] o valoare numeric
dintr-o poziie x. Adaptm aceste notaii la problema
noastr: n loc de x notm cu poz poziia n care se
gsete o not n combinaia de note care va fi generat
i cu nota [poz], nota de pe poziia poz. Poziia poz va
lua valori de la 1 la n (n =total examene). Evident,
nota va fi un vector cu max [i] elemente, unde i este
numrul de ordine al unui examen.
Probleme rezolvate de programare Subiecte propuse la ATESTAT
29
Program
ATESTAT_2003_11_Produs_cartezian_EXAMENE;
uses CRT;
t ype
vect or = ar r ay [ 1. . 20] of i nt eger ; {20 =
nr . de examene}
var
i , poz, n : i nt eger ;
max, not a : vect or ;
S, mi n : i nt eger ;
procedure SCRIE;
begi n
wr i t e ( ' { ' ) ;
f or i : = 1 t o n - 1 do
begi n
wr i t e ( not a[ i ] , ' , ' ) ;
end;
wr i t e ( not a[ n] , ' ' ) ;
wr i t e ( ' } ' ) ;
wr i t el n;
end;
Begin { PROGRAM PRINCIPAL }
CLRSCR;
wr i t e ( ' I nt r oducet i numar ul de EXAMENE, n =
' ) ;
r eadl n ( n) ;
wr i t el n;
wr i t el n ( Pent r u f i ecar e examen, pr eci zat i
car e est e not a MAXI MA ) ;
wr i t el n ( ' Scr i et i 10 pt . not e de l a 1 l a 10 :
' ) ;
wr i t el n;
f or i : = 1 t o n do
begi n
wr i t e ( ' Pent r u examenul ' , i , ' Car e
est e not a MAXI MA ? ' ) ;
r eadl n ( max [ i ] ) ;
end;
wr i t el n;
Wr i t el n ( ' Punct aj ul mi ni m= suma not el or l a
f i ecar e examen' ) ;
wr i t e ( ' Pr eci zat i punct aj ul MI NI M pe car e
vr et i sa- l obt i net i , Mi n = ' ) ;
Probleme rezolvate de programare Subiecte propuse la ATESTAT
30
r eadl n ( mi n) ;
poz : = 1; {nceput algoritm
BACKTRACKING}
not a [ poz] : = 0;
whi l e poz > 0 do
begi n
i f nota [poz] < max [poz] t hen
begi n
not a [ poz] : = not a [ poz] +
1;
i f poz = n t hen
begi n
S : = 0;
f or i : = 1 t o n do
S := S + nota [i]
;
i f S = min t hen
SCRIE;
end
el se
begi n
poz := poz + 1; {PAS
NAI NTE}
not a [ poz] : = 0
end
end
el se
poz := poz 1 {PAS
NAPOI }
end;
r eadl n
end.
Probleme rezolvate de programare Subiecte propuse la ATESTAT
31
ATESTAT - 2003 - 12 - Afiai numere prime mai mici
dect un numr n citit de la tastatur, care rmn prime
i dup ce au fost inversate.
Rezolvare:
Definim o funcie PRIM, cu rezultat de tip BOOLEAN,
care testeaz dac un numr este prim.
Definim o funcie INVERS care inverseaz elementele
unui ir.
n programul principal, nainte de a inversa un numr x,
l transformm mai nti ntr-un ir cu funcia STR.
Dup inversare, transformm irul obinut ntr-un
numr cu funcia VAL.
Testm dac numrul obinut prin inversare este i el
prim.
Program ATESTAT_2003_12 ;
uses cr t ;
var
i nver sul , si r : st r i ng;
a, b, i , x, n, i nvx : i nt eger ;
function PRIM ( x : i nt eger ) : bool ean;
var
nr di v, di vi z : i nt eger ;
begi n
nr di v : = 0;
di vi z : = 1;
whi l e di vi z <= x do
begi n
i f x MOD di vi z = 0 t hen
nr di v : = nr di v + 1;
di vi z : = di vi z + 1
end;
i f nrdiv = 2 t hen
PRI M : = TRUE
el se
PRI M : = FALSE;
end;
Probleme rezolvate de programare Subiecte propuse la ATESTAT
32
function INVERS ( s : st r i ng) : st r i ng;
var
i nv : st r i ng;
begi n
i nv : = ' ' ;
f or i : = LENGTH ( s) DOWNTO 1 do
begi n
i nv : = i nv + s [ i ]
end;
I NVERS : = i nv ;
end;
Begin { PROGRAM PRINCIPAL }
cl r scr ;
wr i t e( ' Dat i n = ' ) ;
r eadl n ( n) ;
wr i t el n;
f or x : = 1 t o n do
begi n
STR ( x, si r ) ;
i nver sul : = INVERS ( si r ) ;
VAL ( i nver sul , a, b) ;
i nvx : = a;
Probleme rezolvate de programare Subiecte propuse la ATESTAT
33
i f PRI M ( x) = TRUE t hen
begi n
i f PRIM ( i nvx) = TRUE
t hen
begi n
wr i t el n ( ' x = ' ,
x, ' = pr i m' ) ;
wr i t el n ( ' i nvx =
' , i nvx, ' = pr i m' ) ;
end;
end;
end;
r eadl n
end.
ATESTAT - 2003 - 13 - Se citete un vector cu n
componente numere ntregi. S se determine CMMDC al
valorilor din vector.
Rezolvare:
Definim funcia CMMDC cu care calculm CMMDC al
dou numere.
Calculm CMMDC al primelor dou numere din vector
(x1 si x2) i l notm cu C[1].
ncepnd de la i = 2 pn la n, facem atribuirile:
x [i] := C [i-1];
C [i] := CMMDC ( x [i], x [i+1] )
Altfel spus, calculm CMMDC dintre CMMDC-ul
anterior i urmtorul element al vectorului.
Program ATESTAT_2003_13 ;
uses cr t ;
const
nmax = 100;
t ype
vect or = ar r ay [ 1. . nmax] of i nt eger ;
var
x, C : vect or ;
sol , n, i : i nt eger ;
Probleme rezolvate de programare Subiecte propuse la ATESTAT
34
function CMMDC ( A, B : i nt eger ) : i nt eger ;
var
aux, R : i nt eger ;
begi n
i f A < B t hen
begi n
aux : = A;
A : = B;
B : = aux
end;
R : = A MOD B;
whi l e R <> 0 do
begi n
A : = B;
B : = R;
R : = A MOD B
end;
CMMDC : = B
end; { sf ar si t f unct i e CMMDC }
Begin { PROGRAM PRINCIPAL }
cl r scr ;
wr i t e( ' Dat i n = ' ) ;
r eadl n ( n) ;
wr i t el n;
Probleme rezolvate de programare Subiecte propuse la ATESTAT
35
wr i t el n ( ' Dat i vect or ul ' ) ;
wr i t el n;
f or i : = 1 t o n do
begi n
wr i t e ( ' Dat i x [ ' , i , ' ] = ' ) ;
r eadl n ( x [ i ] ) ;
end;
C [1] := CMMDC ( x[1], x [2] );
f or i : = 2 to n-1 do
begi n
x [i] := C [i-1];
C [i] := CMMDC ( x [i], x [i+1] )
end;
wr i t el n ( ' CMMDC = ' , C [n-1] ) ;
r eadl n
end.
ATESTAT - 2003 - 14 - Se citesc 2 numere naturale A <
B. S se tipreasc toate numerele PALINDROAME
dintre A i B. Un numr este PALINDROM dac, citit
direct i invers, rezultatul este acelai (dac este egal cu
inversul su). Exemplu: 323 este PALINDROM.
Rezolvare:
Definim o funcie NRCIFRE pentru a numra cifrele
unui numr natural.
Definim o funcie PALINDROM n care:
- determinm numrul de cifre pentru un numr
natural;
- extragem din numrul natural cifrele i le
depunem ntr-un vector y;
- verificm dac vectorul y este simetric
(PALINDROM).
Probleme rezolvate de programare Subiecte propuse la ATESTAT
36
n programul principal, apelm funcia PALINDROM
pentru toate numerele naturale dintre A i B i le
afim doar pe acelea care sunt palindroame.
Program ATESTAT_2003_14 ;
uses cr t ;
VAR
A, B, x, n, nr ci f , i : i nt eger ;
OK : bool ean;
y : ar r ay [ 1. . 100] of i nt eger ;
function NRCIFRE ( x : i nt eger ) : i nt eger ;
begi n
i f x = 0 t hen
nr ci f : = 1
el se
begi n
nr ci f : = 0;
whi l e x <> 0 do
begi n
nr ci f : = nr ci f + 1;
x : = x DI V 10
end;
end;
NRCI FRE : = nr ci f
end;
Probleme rezolvate de programare Subiecte propuse la ATESTAT
37
function PALINDROM ( x : i nt eger ) : bool ean;
begi n
n : = NRCI FRE ( x) ;
f or i : = n DOWNTO 1 do
begi n
y [ i ] : = x MOD 10;
x : = x DI V 10;
end;
OK : = TRUE;
f or i : = 1 t o n DI V 2 do
begi n
i f y [ i ] <> y [ n- i +1] t hen
OK : = FALSE
end;
PALI NDROM : = OK
end;
Begin { PROGRAM PRINCIPAL }
cl r scr ;
wr i t e ( ' Dat i A = ' ) ; r eadl n ( A) ;
wr i t el n;
wr i t e ( ' Dat i B = ' ) ; r eadl n ( B) ;
wr i t el n;
cl r scr ;
f or x : = A t o B do
begi n
i f PALINDROM ( x) = TRUE t hen
wr i t el n ( ' x = ' , x, ' est e
PALI NDROM' ) ;
{ el se
wr i t el n ( ' x = ' , x, ' NU est e
pal i ndr om' ) ; }
{r eadl n; }
end;
r eadl n
end.
Probleme rezolvate de programare Subiecte propuse la ATESTAT
38
ATESTAT - 2003 - 15 - Se citete un vector cu n
componente ntregi. Care este cea mai mare sum care se
poate forma cu ele?
Exemplu: n =4, iar numerele citite sunt 1, 3, 2, -7. Se va
tipri 5.
Rezolvare:
Numerele ntregi introduse vor fi reinute ntr-un vector
x.
Numerele ntregi introduse pot fi pozitive, negative sau
nule. Evident, suma cea mai mare ce se poate obine din
ntregul ir de numere va rezulta prin nsumarea doar a
numerelor pozitive.
Notm cu Spoz suma numerelor strict pozitive. ntr-o
bucl FOR, vom aduga la aceast sum cte un
termen, doar dac acest termen este strict > 0.
Program ATESTAT_2003_15 ;
uses cr t ;
VAR
Spoz, n, i : i nt eger ;
x : ar r ay [ 1. . 100] of i nt eger ;
Probleme rezolvate de programare Subiecte propuse la ATESTAT
39
Begin { PROGRAM PRINCIPAL }
cl r scr ;
wr i t e ( ' Dat i n = ' ) ;
r eadl n ( n) ;
wr i t el n;
wr i t el n ( ' Dat i vect or ul ' ) ;
f or i : = 1 t o n do
begi n
wr i t e ( ' Dat i x [ ' , i , ' ] = ' ) ;
r eadl n ( x [ i ] ) ;
end;
wr i t el n;
Spoz : = 0;
f or i : = 1 t o n do
begi n
i f x [i] > 0 t hen
Spoz := Spoz + x [i];
end;
wr i t el n ( ' Spoz = ' , Spoz) ;
r eadl n
end.
ATESTAT - 2003 - 16 Interschimbai coloanele unei
matrici cu m linii i n coloane astfel nct, n linia k,
elementele s fie ordonate cresctor.
Rezolvare:
Ordonm linia k. n cursul procesului de ordonare, o
parte din elementele liniei k se interschimb ntre ele.
n paralel cu ordonarea, interschimbm i coloanele
corespunztoare elementelor de pe linia k supuse
interschimbrilor.
Probleme rezolvate de programare Subiecte propuse la ATESTAT
40
Program ATESTAT_2003_16 ;
uses cr t ;
VAR
OK, m, n, i , j , k : i nt eger ;
A : ar r ay [ 1. . 100, 1. . 100] of i nt eger ;
aux : i nt eger ;
Begin { PROGRAM PRINCIPAL }
cl r scr ;
wr i t e( ' Dat i m= ' ) ;
r eadl n ( m) ;
wr i t el n;
wr i t e ( ' Dat i n = ' ) ;
r eadl n ( n) ;
wr i t el n;
wr i t e ( ' Dat i l i ni a k = ' ) ;
r eadl n ( k) ;
wr i t el n;
Probleme rezolvate de programare Subiecte propuse la ATESTAT
41
wr i t el n ( ' Dat i mat r i cea' ) ;
f or i : = 1 t o mdo
begi n
f or j : = 1 t o n do
begi n
wr i t e ( ' Dat i A [ ' , i ,
' , ' , j , ' ] = ' ) ;
r eadl n ( A [ i , j ] ) ;
end;
end;
REPEAT {Ordonm linia k, pr i n
met oda BUBBLE- SORT}
OK : = 0;
j : = 1;
REPEAT
i f A [ k, j ] > A [ k, j +1] t hen
begi n
f or i : = 1 t o mdo
begi n
aux : = A [ i ,
j ] ;
A [ i , j ] : = A
[ i , j +1] ;
A [ i , j +1] : =
aux;
OK : = 1;
end;
end;
j : = j + 1;
UNTI L ( j > n - 1) ;
UNTI L ( OK = 0) ;
wr i t el n;
wr i t el n ( ' Mat r i cea or donat a est e' ) ;
f or i : = 1 t o mdo
begi n
f or j : = 1 t o n do
begi n
wr i t e ( ' A [ ' , i , ' , ' ,
j , ' ] = ' , A [ i , j ] , ' ' ) ;
end;
wr i t el n;
end;
Probleme rezolvate de programare Subiecte propuse la ATESTAT
42
r eadl n
end.
ATESTAT - 2003 - 17 - Se citete un text i o succesiune
de caractere. De cte ori ntlnim aceast succesiune n
cadrul textului ?
Rezolvare:
Apelm funcia POS (subir, ir) i determinm poziia
unde apare subir n ir.
Dac poziia determinat este <> 0, atunci majorm
contorul nrapariii, care numr apariiile subirului n
ir.
De asemenea, dac poziia determinat este <> 0,
tergem din irul dat caracterele, de la poziia 1, pe o
lungime = poziia + LENGTH (subir) 1, unde
poziia este valoarea determinat cu funcia POS.
Probleme rezolvate de programare Subiecte propuse la ATESTAT
43
Program ATESTAT_2003_17 ;
uses cr t ;
var
si r , subsi r : st r i ng;
pozi t i a, nr apar i t i i : i nt eger ;
OK : bool ean;
Begin { PROGRAM PRINCIPAL }
cl r scr ;
wr i t e( ' Dat i si r ul = ' ) ;
r eadl n ( si r ) ;
wr i t el n;
wr i t el n ( ' Dat i subsi r ul = ' ) ;
r eadl n ( subsi r ) ;
wr i t el n;
nraparitii := 0;
OK := TRUE; { pr esupun ca subsi r ul
exi st a }
whi l e ( si r <> ' ' ) AND ( OK = TRUE ) do
begi n
pozi t i a : = POS ( subsi r , si r ) ;
i f pozi t i a <> 0 t hen
begi n
nr apar i t i i : =
nr apar i t i i + 1 ;
DELETE ( si r , 1, pozi t i a
+ LENGTH ( subsi r ) - 1 )
end
el se
OK : = FALSE
end;
wr i t el n ( ' nr apar i t i i = ' , nr apar i t i i ) ;
r eadl n
end.
ATESTAT - 2003 - 18 - Problema celor 8 regine. S se
afieze toate posibilitile de a se aeza, pe o tabl de ah, 8
regine fr s se atace ntre ele.
Rezolvare:
Probleme rezolvate de programare Subiecte propuse la ATESTAT
44
Problema reginelor cere s se plaseze n regine pe o tabl de
ah de dimensiune n x n astfel nct oricare dou regine
s nu se atace. Pentru ca dou regine s nu se atace, ele
trebuie s nu fie situate pe aceeai linie, pe aceeai coloan
sau pe aceeai diagonal. Pe fiecare linie trebuie s fie
plasat cte o regin. Deci, pentru ca poziia reginelor s fie
complet determinat, este suficient s reinem, pentru fiecare
regin, coloana n care este plasat, ntr-un vector soluie f,
de dimensiune n, unde f [i] reprezint coloana n care este
plasat regina de pe linia i. Generarea matricilor care
afieaz poziiile reginelor, n condiiile problemei, se va
face apelnd la un algoritm backtracking.
Observaii:
Notm cu x, respectiv i o linie oarecare i cu f [x],
respectiv f [i] coloana pe care se gsete regina de pe linia
x, respectiv linia i.
Condiiile interne:
a). f [x] =1, 2, ..., n, pentru oricare x =1, 2, ..., n
b). Condiia dou regine nu pot fi plasate pe aceeai
coloan se va exprima analitic astfel:
f [x] f [y] pentru orice x y, cu x, y = 1, 2,...,n.
c). Dou regine nu pot fi plasate pe aceeai diagonal. Dac
regina de pe linia i, coloana f [i] este pe aceeai diagonal cu
regina de pe linia x, coloana f [x], atunci triunghiul
dreptunghic care se formeaz are unghiurile de 45 grade, este
deci isoscel (catetele sale vor fi egale), ceea ce se poate scrie
astfel:
| i - x | = | f [ i ] - f [ x ] |
Cum acest lucru nu este permis de problem, condiia dou
regine nu pot fi plasate pe aceeai diagonal se va
exprima astfel:
| f [i] - f [x] | <> | i - x | pentru orice i, x =1, 2, ..., n
Probleme rezolvate de programare Subiecte propuse la ATESTAT
45
Definim o procedur AFIARE astfel nct:
n momentul apelrii procedurii, evident s-a gsit o soluie
pe care o numrm scriind:
Nrsol :=
Nrsol +1
i apoi afim Nrsol.
Vom parcurge toate coloanele de la 1 la n. Pentru aceasta
avem nevoie de un contor poziional col care va lua valori
de la 1 la n.
n procedur, col este o coloan curent, iar f [lin] este
tot o coloan, i anume coloana pe care se gsete regina
de pe linia lin.
Procedura va tipri " * " dac pe coloana curent col
exist o regin, adic atunci cnd
col = f [lin], i va tipri "o" dac aceast condiie nu este
satisfcut.
Program ATESTAT_2003_18_REGINE ;
uses cr t ;
const
nr maxr egi ne = 8;
t ype
vect or sol ut i e = ar r ay [ 0. . nr maxr egi ne] of
0. . nr maxr egi ne;
var
f : vect or sol ut i e;
n, x, i : 0 . . nr maxr egi ne;
ok : bool ean;
nr sol : wor d;
procedure AFISARE;
var
i , j : 0 . . nr maxr egi ne;
begi n
nr sol : = nr sol + 1;
wr i t el n;
wr i t el n ( ' Sol ut i a nr . ' , nr sol ) ;
f or i : = 1 t o n do
begi n
f or j : = 1 t o n do
Probleme rezolvate de programare Subiecte propuse la ATESTAT
46
begi n
i f j = f [ i ] t hen
wr i t e ( ' * ' )
el se
wr i t e ( ' o ' )
end;
wr i t el n;
end;
wr i t el n;
r eadl n
end; { sf ar si t pr ocedur a }
Begin { PROGRAM PRINCIPAL }
cl r scr ;
wr i t e ( ' I nt r oducet i numar ul de pat r at el e n
= ' ) ;
r eadl n ( n) ;
nrsol: =0;
x : = 1; { vi r f ul st i vei }
f [ x] : = 0;
while x > 0 do { ct t i mp st i va nu est e
vid nceput algoritm }
begi n
{ backtracking }
while f [ x] < n do { ct t i mp
exist valori disponibile }
begi n
f [ x] : = f [ x] + 1;
Probleme rezolvate de programare Subiecte propuse la ATESTAT
47
ok : = t r ue;
f or i : = 1 t o x - 1 do
begi n
i f ( f [ i ] = f [ x] ) OR ( ABS
( i - x) = ABS ( f [ i ] - f [ x] ) ) t hen
begi n
ok : = f al se;
end
end;
i f ok = t r ue t hen { val oar ea
este valid }
begi n
i f x = n t hen { st i va
este plin }
AFI SARE
el se
begi n
x := x + 1;
{PAS NAINTE}
f [ x] : = 0
end;
end;
end; { sf ar si t WHI LE i nt er i or }
x := x 1
{PAS NAPOI}
end; { sf ar si t WHI LE ext er i or }
r eadl n
end.
ATESTAT - 2003 - 19 - Se dau dou numere naturale n i
k. S se genereze toate combinrile de n elemente luate
cte k.
Rezolvare: Aplicm algoritmul BACKTRACKING
pentru generarea combinrilor.
Program ATESTAT_2003_19_COMBINARI_BACKTRACKING_1
;
uses CRT;
CONST
Probleme rezolvate de programare Subiecte propuse la ATESTAT
48
Kmax = 20; { nr . max a l ui k }
Nmax = 50; { nr . max a l ui n }
TYPE
f unct i e = ar r ay [ 1 . . Kmax ] of 0 . . Nmax;
VAR
k, poz, i : 1 . . Kmax; { se consi der a k
<= n }
n : 0 . . Nmax;
f : f unct i e;
I MAG : set of 1 . . Nmax; { I MAG = mul t i mea
i magi ni l or el ement el or di n A }
{ adi ca f [ poz] }
Begin { PROGRAM PRINCIPAL }
cl r scr ;
REPEAT
wr i t e ( ' k = ' ) ;
r eadl n ( k) ;
UNTI L ( k >= 1 ) AND ( k <= Kmax) ;
REPEAT
wr i t e ( ' I nt r oducet i un n >= ' , k, '
n = ' ) ;
r eadl n ( n) ;
i f n < k t hen
wr i t el n ( ' Pent r u acest n = ' , n, '
Nu exi st a sol ut i i ' )
UNTI L ( n >= k) AND ( n >= 1 ) AND ( n<=
Nmax ) ;
wr i t el n;
Probleme rezolvate de programare Subiecte propuse la ATESTAT
49
poz : = 1; {poz = vrful stivei }
f [ poz] : = 0 ;
whi l e poz > 0 do { ct t i mp st i va nu est e
vid }
begi n
whi l e f [poz] < n - k + poz do {
a doua condiie intern }
begi n
f [ poz] : = f [ poz] +
1;
i f poz = k t hen {
dac stiva este plin }
begi n
f or i : = 1
t o k do
begi n
wr i t e
( ' f [ ' , i , ' ] = ' , f [ i ] , ' ' ) ;
end;
wr i t el n;
wr i t el n
end
el se
begi n
poz := poz
+ 1 ; { I NSERARE i n STI VA }
f [ poz] : =
f [ poz - 1]
end;
end; { sf ar si t WHI LE i nt er i or
}
poz := poz - 1; { EXTRAGERE di n
STI VA = PAS I NAPOI }
end; { sf ar si t WHI LE ext er i or }
r eadl n
end.
ATESTAT - 2003 - 20 - S se genereze toate irurile de
lungime n formate numai din literele A i M, iruri
Probleme rezolvate de programare Subiecte propuse la ATESTAT
50
care s nu aib dou litere A alturate. Numrul n (0
< n < 13) se citete de la tastatur. Fiecare ir va fi scris pe
cte un rnd al ecranului fr spaiu ntre litere.
Rezolvare:
Problema const n generarea produsului cartezian al
mulimilor de caractere. Generarea combinaiilor de litere
se face dup algoritmul BACKTRACKING.
Algoritmul de generare a produsului cartezian va genera
valori numerice cuprinse ntre 1 i elementul maxim al
unei mulimi implicate n acest produs. Cum pe noi ne
intereseaz combinaiile de litere a i m, vom
asocia unui numr din cte o mulime o liter, astfel:
dac f [i] = 1, atunci sir [i] = a
dac f [i] = 2, atunci sir [i] = m.
Nu ne intereseaz dect aceste valori ale lui f [i].
Procedura SCRIE se va apela n mod opional, pentru a
observa modul de generare a produsului cartezian n
varianta sa numeric.
Procedura SCRIETEXT va afia doar combinaiile de
litere a i m.
Funcia boolean VECINI testeaz dac avem litera
a pe dou poziii vecine.
Funcia boolean EXIST verific dac n ir exist i
cifra 1. n acest fel se vor elimina combinaiile care nu-l
conin pe 1 (adic acele combinaii de litere care nu
conin litera a i care, deci, nu ne intereseaz).
Vectorul nrelem reine numrul de elemente al
fiecrei mulimi din produsul cartezian.
Poz = poziia unui element ntr-o mulime a
produsului cartezian.
Probleme rezolvate de programare Subiecte propuse la ATESTAT
51
Program ATESTAT_2003_20_Produs_cartezian_AMA ;
uses CRT;
t ype
vect or = ar r ay [ 1. . 20] of i nt eger ;
var
i , poz, n : i nt eger ;
nr el em, f : vect or ;
si r : st r i ng;
procedure SCRIE; {procedura opional}
begi n
wr i t e ( ' { ' ) ;
f or i : = 1 t o n - 1 do
begi n
wr i t e ( f [ i ] , ' , ' ) ;
end;
wr i t e ( f [ n] , ' ' ) ; wr i t e ( ' } ' ) ;
wr i t el n;
end;
procedure SCRIETEXT;
begi n
f or i : = 1 t o n do
begi n
i f f [ i ] = 1 t hen
si r [ i ] : = ' a' ;
i f f [ i ] = 2 t hen
si r [ i ] : = ' m' ;
wr i t e ( si r [ i ] , ' ' ) ;
end;
wr i t el n;
end;
function VECINI: bool ean;
var
OK : bool ean;
begi n
OK : = FALSE;
f or i : = 1 t o n - 1 do
begi n
i f ( f [ i ] = 1 ) AND ( f [ i + 1]
= 1) t hen
OK : = TRUE
end;
VECI NI : = OK
end;
Probleme rezolvate de programare Subiecte propuse la ATESTAT
52
function EXISTA : bool ean; { ver i f i ca daca i n
si r exi st a si ci f r a 1 }
var
OK : bool ean;
begi n
OK : = FALSE;
f or i : = 1 t o n do
begi n
i f f [ i ] = 1 t hen
OK : = TRUE
end;
EXI STA : = OK;
end;
Begin { PROGRAM PRINCIPAL }
CLRSCR;
wr i t e ( ' St abi l i t i numar ul de mul t i mi , n =
' ) ;
r eadl n ( n) ;
f or i : = 1 t o n do
begi n
wr i t e ( ' Cat e el ement e ar e mul t i mea
' , i , ' : ' ) ;
r eadl n ( nr el em[ i ] ) ;
end;
Probleme rezolvate de programare Subiecte propuse la ATESTAT
53
poz : = 1;
f [ poz] : = 0;
whi l e poz > 0 do
begi n
i f f [ poz] < nr el em[ poz] t hen
begi n
f [ poz] : = f [ poz] + 1;
i f poz = n t hen
begi n
i f ( NOT VECINI) AND
( EXISTA) t hen
begi n
{SCRI E; } {apel
opt i onal al
acest ei pr ocedur i }
SCRIETEXT;
End;
end
el se
begi n
poz : = poz + 1; {PAS
INAINTE}
f [ poz] : = 0
end
end
el se
poz : = poz 1 {PAS INAPOI}
end;
r eadl n
end.
ATESTAT - 2003 - 21 - Generarea permutrilor de n
elemente, n >0.
Rezolvare:
Aplicnd algoritmul BACKTRACKING, vom genera
permutrile de ordinul n n variant iterativ.
Program ATESTAT_2003_21_PERMUTARI_ITERATIV;
Probleme rezolvate de programare Subiecte propuse la ATESTAT
54
uses cr t ;
const
nmax = 100;
t ype
vect or = ar r ay [ 1. . nmax] of i nt eger ;
var
f : vect or ;
sol , n, i : i nt eger ;
procedure VERIFICA ( k : i nt eger ; f : vect or ;
VAR CONTI N : bool ean ) ;
LABEL
10;
begi n
CONTI N : = TRUE;
f or i : = 1 t o k - 1 do
begi n
i f f [ i ] = f [ k] t hen
begi n
CONTI N : = FALSE;
GOTO 10
end;
end;
10:
end;
Probleme rezolvate de programare Subiecte propuse la ATESTAT
55
procedure SCRIE ;
begi n
sol : = sol + 1;
wr i t e ( ' Sol ut i a nr . ' , sol , ' ' ) ;
f or i : = 1 t o n do
begi n
wr i t e ( f [ i ] : 3 )
end;
wr i t el n
end;
procedure PERMUTA ( m: i nt eger ) ;
LABEL
20;
var
poz : i nt eger ;
CONTI N : bool ean;
begi n
poz : = 1;
f [ poz] : = 0;
while poz > 0 do
begi n
CONTI N : = FALSE;
while f [ poz] < mdo
begi n
f [ poz] : = f [ poz] + 1;
VERIFICA ( poz, f ,
CONTI N) ;
i f CONTI N = TRUE t hen
GOTO 20
end; {sf ar si t WHI LE
i nt er i or }
20: i f ( CONTI N = TRUE ) AND ( poz = n)
t hen
SCRIE;
i f ( CONTI N = TRUE ) and ( poz < n)
t hen
begi n
poz : = poz + 1; {PAS
INAINTE}
f [ poz] : = 0
end;
Probleme rezolvate de programare Subiecte propuse la ATESTAT
56
i f CONTI N = FALSE t hen
poz : = poz 1 {PAS INAPOI}
end; {sf ar si t WHI LE ext er i or }
end; {sf ar si t pr ocedur a PERMUTA}
Begin { PROGRAM PRINCIPAL }
cl r scr ;
sol : = 0;
wr i t e( ' Dat i n = ' ) ;
r eadl n ( n) ;
wr i t el n;
PERMUTA (n);
i f sol = 0 t hen
wr i t el n ( ' Nu exi st a sol ut i e' ) ;
r eadl n
end.
Probleme rezolvate de programare Subiecte propuse la ATESTAT
57
ATESTAT - 2003 - 22 - S se afieze termenii irului lui
Fibonacci, pentru un n dat.
Rezolvare:
Termenii irului vor fi reinui ntr-un tablou FIBO.
Generarea termenilor se va face n variant iterativ.
Program ATESTAT_2003_22 ;
CONST
nmax = 100;
TYPE
vect or = ar r ay [ 1. . nmax] of i nt eger ;
VAR
FI BO : vect or ;
n, i : i nt eger ;
Begin { PROGRAM PRINCIPAL }
wr i t e ( ' Dat i numr aul de t er meni , n = ' ) ;
r eadl n ( n) ;
FI BO [ 1] : = 1;
FI BO [ 2] : = 1;
f or i : = 3 t o n do
begi n
FI BO [ i ] : = FI BO [ i - 1] +
FI BO[ i - 2] ;
end;
f or i : = 1 t o n do
begi n
wr i t el n ( FI BO [ i ] , ' = ' , FI BO
[ i ] )
end;
r eadl n
end.
ATESTAT - 2003 - 23 - Fie A un ir cu n elemente
ntregi, n > 0. S se ordoneze cresctor folosind metoda
bulelor.
Probleme rezolvate de programare Subiecte propuse la ATESTAT
58
Rezolvare:
Definim procedura ORDONEAZA, bazat pe
algoritmul de sortare BUBBLE-SORT.
Definim procedura TIPARESTE, care afieaz
vectorul sortat.
Program ATESTAT_2003_23_BUBBLE_SORT ;
uses CRT;
const
nmax = 30;
t ype
vect or = ar r ay [ 1. . nmax] of i nt eger ;
var
a : vect or ;
i , n : i nt eger ;
procedure ORDONEAZA ( var x: vect or ; m: i nt eger ) ;
var
k, j , aux: i nt eger ;
begi n
r epeat
k: = 0;
j : = 1;
Probleme rezolvate de programare Subiecte propuse la ATESTAT
59
r epeat
i f x[ j ] < x [ j +1] t hen
begi n
aux : = x[ j ] ;
x[ j ] : = x[ j +1] ;
x[ j +1] : = aux;
k : = 1
end;
j : = j + 1
unt i l ( j > m- 1)
unt i l ( k = 0) ;
end;
procedure TIPARESTE ( x: vect or ; m: i nt eger ) ;
begi n
f or i : = 1 t o mdo
begi n
wr i t el n ( ' x [ i ] = ' , x
[ i ] )
end
end;
Begin { PROGRAM PRINCIPAL }
clrscr;
wr i t e ( ' I nt r oducet i n = ' ) ;
r eadl n ( n) ;
wr i t el n;
f or i : = 1 t o n do
begi n
wr i t e ( ' a [ i ] = ' ) ;
r eadl n ( a [ i ] )
end;
wr i t el n;
r eadl n;
clrscr;
wr i t el n;
ORDONEAZA ( a, n) ;
TIPARESTE ( a, n) ;
wr i t el n;
r eadl n
Probleme rezolvate de programare Subiecte propuse la ATESTAT
60
end.
ATESTAT - 2003 - 24 - Fie A i B doi vectori cu cte m,
respectiv n elemente numere ntregi (m >0, n >0),
ordonai cresctor. S se interclaseze, n vectorul C,
vectorii A i B.
Rezolvare:
Program ATESTAT_2003_24_INTERCLASARE ;
uses CRT;
CONST
nmax = 50;
TYPE
vect or = ar r ay [ 1. . nmax] of i nt eger ;
vect or t ot = ar r ay [ 1. . 2*nmax] of i nt eger ;
Probleme rezolvate de programare Subiecte propuse la ATESTAT
61
var
m, n, i , j , k : i nt eger ;
A, B : vect or ;
C : vect or t ot ;
Begin { PROGRAM PRINCIPAL }
cl r scr ;
wr i t e ( ' Dat i numar ul de el ement e al e
vect or ul ui a, m= ' ) ;
r eadl n ( m) ;
wr i t e ( ' Dat i numar ul de el ement e al e
vect or ul ui b, n = ' ) ;
r eadl n ( n) ;
wr i t el n;
wr i t el n ( ' Dat i pr i mul vect or SORTAT : ' ) ;
wr i t el n;
f or i : = 1 t o mdo
begi n
wr i t e ( ' A [ ' , i , ' ] = ' ) ;
r eadl n ( A [ i ] ) ;
end;
wr i t el n;
wr i t el n ( ' Dat i al doi l ea vect or SORTAT' ) ;
wr i t el n;
f or j : = 1 t o n do
begi n
wr i t e ( ' B [ ' , j , ' ] = ' ) ;
r eadl n ( B [ j ] ) ;
end;
k : = 0;
i : = 1;
j : = 1;
WHI LE ( i <= m) AND ( j <= n) do
begi n
i f A [ i ] <= B [ j ] t hen
begi n
k : = k + 1;
C [ k] : = A [ i ] ;
i : = i + 1;
end
Probleme rezolvate de programare Subiecte propuse la ATESTAT
62
el se
begi n
k : = k + 1;
C [ k] : = B [ j ] ;
j : = j + 1;
end;
end;
WHI LE i <= mdo
begi n
k : = k + 1;
C [ k] : = A [ i ] ;
i : = i + 1
end;
WHI LE j <= n do
begi n
k : = k + 1;
C [ k] : = B [ j ] ;
j : = j + 1
end;
Probleme rezolvate de programare Subiecte propuse la ATESTAT
63
wr i t el n;
wr i t el n ( ' Vect or ul r ezul t at i n ur ma
i nt er cl asar i i est e: ' ) ;
wr i t el n;
f or k : = 1 t o m + n do
begi n
wr i t el n ( ' C [ ' , k, ' ] = ' , C [ k] ) ;
end;
r eadl n
end.
ATESTAT - 2003 - 25 - Fie X un vector ordonat cu n
elemente numere ntregi, n > 0 i elem o valoare ntreag,
citit de la tastatur. S se decid dac elem se gsete n
vectorul X, folosind metoda Divide et Impera.
Rezolvare:
Program ATESTAT_2003_25_Cautare_Binara_Recursiva
;
uses CRT;
t ype
vect or = ar r ay [ 1. . 20] of i nt eger ;
VAR
x : vect or ;
el em, n, i : i nt eger ;
GASI T : bool ean; {GASI T = TRUE daca el ement ul
a f ost gasi t si FALSE daca nu}
procedure CAUTA ( i ncep, sf : i nt eger ; VAR GASI T
: bool ean ) ;
var
m: i nt eger ;
begi n
I F i ncep <= sf t hen
begi n
m: = ( i ncep + sf ) DI V 2;
i f el em= x [ m] t hen
Probleme rezolvate de programare Subiecte propuse la ATESTAT
64
GASI T : = t r ue
el se
i f el em< x [ m] t hen
CAUTA ( i ncep, m- 1, GASI T)
el se
CAUTA ( m+1, sf , GASI T)
end
ELSE
GASI T : = f al se
end; {sf ar si t pr ocedur a}
Begin { PROGRAM PRINCIPAL }
CLRSCR;
wr i t e ( ' n = ' ) ;
r eadl n ( n) ;
f or i : = 1 t o n do
begi n
wr i t e ( ' x [ ' , i , ' ] = ' ) ;
r eadl n ( x[ i ] ) ;
end;
Probleme rezolvate de programare Subiecte propuse la ATESTAT
65
wr i t el n;
wr i t e ( ' Dat i el ement ul caut at , el em= ' ) ;
r eadl n ( el em) ;
CAUTA ( 1, n, GASI T) ;
i f GASI T = t r ue t hen
wr i t el n ( el em, ' exi st a' )
el se
wr i t el n ( el em, ' nu exi st a' ) ;
r eadl n
end.
ATESTAT - 2003 - 26 - Fie n numere ntregi a1, a2, ... an,
cu n > 0. S se determine CMMDC al celor n numere, prin
metoda DEI.
Rezolvare:
Prin metoda DEI (Divide-Et-Impera) se determin
CMMDC pentru prima jumtate a vectorului, apoi pentru
cea de-a doua jumtate, dup care vom reuni rezultatele.
Program ATESTAT_2003_26_CMMDC_DEI ;
CONST
nmax = 100;
TYPE
vect or = ar r ay [ 1. . nmax] of i nt eger ;
VAR
x : vect or ;
C, n, i : i nt eger ;
function CMMDC ( A, B : i nt eger ) : i nt eger ;
var
aux, R : i nt eger ;
begi n
i f A < B t hen
begi n
aux : = A;
A : = B;
B : = aux
end;
Probleme rezolvate de programare Subiecte propuse la ATESTAT
66
R : = A MOD B;
whi l e R <> 0 do
begi n
A : = B;
B : = R;
R : = A MOD B
end;
CMMDC : = B
end; { sf ar si t f unct i e CMMDC }
function DIVCOM ( i ncep, sf : i nt eger ) : i nt eger ;
{ det er mi na CMMDC pr i n DEI }
VAR
mi j , C1, C2 : i nt eger ;
begi n
i f i ncep = sf t hen
DI VCOM : = x [ i ncep]
el se
begi n
i f sf - i ncep = 1 t hen
DI VCOM : = CMMDC ( x [ i ncep] ,
x [ sf ] )
Probleme rezolvate de programare Subiecte propuse la ATESTAT
67
el se
begi n
mi j : = ( i ncep + sf )
DI V 2;
C1 : = DI VCOM ( i ncep,
mi j ) ;
C2 : = DI VCOM ( mi j + 1,
sf ) ;
DI VCOM : = CMMDC ( C1,
C2)
end
end
end; { sf ar si t f unct i e DI VCOM }
Begin { PROGRAM PRINCIPAL }
wr i t e ( ' Dat i nr . de el ement e al e vect or ul ui ,
n = ' ) ;
r eadl n ( n) ;
f or i : = 1 t o n do
begi n
wr i t e ( ' Dat i x [ ' , i , ' ] = ' ) ;
r eadl n ( x [ i ] )
end;
C : = DI VCOM ( 1, n) ;
wr i t el n ( ' C = ' , C) ;
r eadl n
end.
ATESTAT - 2003 - 27 - Fie A un ir cu n numere
ntregi, n > 0. S se ordoneze cresctor folosind metoda
sortrii prin numrare.
Rezolvare:
Descrierea metodei:
Iat o situaie concret: la ora de educaie fizic elevii
trebuie s se aeze n ordinea cresctoare a nlimii.
Fiecare elev va numra ci colegi sunt mai mici ca
nlime dect el. Astfel, dac un elev E va ti c are 15
Probleme rezolvate de programare Subiecte propuse la ATESTAT
68
colegi mai mici dect el, atunci elevul E se va aeza pe
poziia 16.
Metoda de sortare prin numrare const n urmtoarele:
Fie A un vector cu n elemente. Se va crea un vector NR
astfel nct :
NR [i] ="numrul de valori din A mai mici dect A[i]".
Folosim un vector auxiliar C, n care vom prelua
elementele sortate ale vectorului A. Fiecare element A[i] va
fi trecut n C n poziia NR [i] + 1. Pentru exemplul de mai
sus, pentru elevul E, NR [i] = 15, iar poziia pe care
trebuie s-o ocupe E n vectorul sortat va fi 16, deci NR
[i] + 1.
Program ATESTAT_2003_27_SORTARE_PRIN_NUMARARE ;
uses CRT;
const
nmax = 100;
t ype
vect or = ar r ay [ 1. . 10] of i nt eger ;
var
A: vect or ;
i , n: i nt eger ;
procedure CITIRE ( var A: vect or ; n: i nt eger ) ;
var
i : i nt eger ;
begi n
f or i : =1 t o n do
begi n
wr i t e ( ' Dat i A [ ' , i ,
' ] = ' ) ;
r eadl n ( A [ i ] ) ;
end;
end;
Probleme rezolvate de programare Subiecte propuse la ATESTAT
69
pr ocedur e AFISARE ( v: vect or ; m: i nt eger ) ;
begi n
f or i : = 1 t o mdo
begi n
wr i t el n ( ' A [ ' , i , ' ] = ' , v
[ i ] )
end
end;
procedure ORDONARE ( var A: vect or ; n: i nt eger ) ;
var
NR, C: vect or ;
j , i : i nt eger ;
begi n
{Pentru fiecare element A[i] se numr n
A ct e el ement e sunt mai mi ci dect A [ i ] ;
numrul obinut n urma numrrii se trece
n NR [ i ] }
f or i : = 1 t o n do
NR [i] := 0;
f or i : = 2 to n do
begi n
f or j : = 1 to i - 1 do
begi n
i f A [ i ] > A [ j ] t hen
NR [i] := NR [i] + 1
ELSE
NR [j] := NR [j] + 1;
End; { sfrit for interior}
end; {sfrit for exterior}
{Vom cr ea vect or ul t empor ar C, n care se rein
elementele n ordine cresctoare, i apoi l vom
copi a n A. Dac A [i] ar e NR[i] el ement e mai
mi ci dect el , at unci , n vect or ul or donat , A
[i] va fi n poziia NR [i] + 1}.
f or i : = 1 t o n do
C [ NR [i] + 1 ] := A [i];
{copi em n A el ement el e l ui C}
f or i : =1 t o n do
A [i] := C [i];
Probleme rezolvate de programare Subiecte propuse la ATESTAT
70
end; {sf ar si t pr ocedur a ORDONARE}
Begin { PROGRAM PRINCIPAL }
clrscr;
wr i t e ( ' Dat i numar ul de el ement e al e
vect or ul ui , n = ' ) ;
r eadl n ( n) ;
CITIRE (A, n);
ORDONARE (A, n);
AFISARE (A, n);
end.
ATESTAT - 2003 - 28 - S se citeasc din fiierul
VEC.TXT, vectorul V de ntregi i s se calculeze apoi
media aritmetic a elementelor pozitive.
Rezolvare:
Atenie ! Fiierul VEC.TXT trebuie s existe pe discul C:
i s conin valori. Dac nu exist, l vom crea, ca mai
jos, dup care l vom accesa, citind din el ntregi, n
condiiile problemei.
Program ATESTAT_2003_28 ;
VAR
f : f i l e of i nt eger ;
Spoz, poz, x, v, n, i : i nt eger ;
Med : r eal ;
Probleme rezolvate de programare Subiecte propuse la ATESTAT
71
Begin { PROGRAM PRINCIPAL }
ASSI GN ( f , ' C: \ VEC. TXT' ) ;
r ewr i t e ( f ) ;
{ CREAREA lui VEC.TXT }
wr i t e ( ' Dat i numar ul de i nt r egi di n f i si er ,
n = ' ) ;
r eadl n ( n) ;
wr i t el n ( ' I nt r oducet i el ement el e f i si er ul ui
( pozi t i ve si negat i ve) ' ) ;
f or i : = 1 t o n do
begi n
wr i t e ( ' Dat i un i nt r egul al ' , i ,
' l ea x = ' ) ;
r eadl n ( x) ;
wr i t e ( f , x) ;
end;
RESET ( f ) ; {pr egat i r e f i si er pent r u
ci t i r e}
Spoz : = 0; { i ni t i al i zar e suma pozi t i ve }
poz : = 0;
whi l e not EOF ( f ) do
begi n
READ ( f , v) ; { ci t esc o
component a di n f }
i f v > 0 t hen
begi n
poz : = poz + 1;
Spoz : = Spoz + v;
end;
end;
i f poz > 0 t hen
begi n
Med : = Spoz / poz;
wr i t el n ( ' Medi a pozi t i vel or = ' ,
Med) ;
end
el se
wr i t el n ( ' Nu exi st a numer e pozi t i ve' ) ;
r eadl n
end.
Probleme rezolvate de programare Subiecte propuse la ATESTAT
72
ATESTAT - 2003 - 29 - S se calculeze maximul
elementelor matricii A (m, n) i s se adauge la sfritul
fiierului text MAT.TXT.
Rezolvare: Vom folosi un algoritm cunoscut pentru
determinarea maximului dintr-un ir de numere.
Program ATESTAT_2003_29 ;
CONST
nmax = 30;
TYPE
mat r i ce = ar r ay [ 1. . nmax, 1. . nmax] of r eal ;
VAR
A : mat r i ce;
f : f i l e of r eal ;
m, n, i , j : i nt eger ;
x, Max : r eal ;
Begin { PROGRAM PRINCIPAL }
ASSI GN ( f , ' C: \ MAT. TXT' ) ;
r ewr i t e ( f ) ;
r epeat
wr i t e ( ' Dat i m= ' ) ;
r eadl n ( m)
unt i l ( m>= 1) AND ( m<= nmax) ;
Probleme rezolvate de programare Subiecte propuse la ATESTAT
73
r epeat
wr i t e ( ' Dat i n = ' ) ;
r eadl n ( n)
unt i l ( n >= 1) AND ( n <= nmax) ;
wr i t el n ( ' Dat i mat r i cea' ) ;
f or i : = 1 t o mdo
begi n
f or j : = 1 t o n do
begi n
wr i t e ( ' Dat i A [ ' ,
i , ' , ' , j , ' ] = ' ) ;
r eadl n ( A [ i , j ] ) ;
end;
end;
max : = A [ 1, 1] ;
f or i : = 1 t o mdo
begi n
f or j : = 1 t o n do
begi n
i f max < A [ i , j ] t hen
Max : = A [ i , j ]
end;
end;
wr i t el n ( ' Max = ' , Max) ;
RESET ( f ) ;
whi l e not EOF ( f ) do
begi n
r ead ( f , x)
end;
wr i t e ( f , max) ;
RESET ( f ) ;
READ ( f , x) ;
Max : = x;
wr i t el n ( ' Max ci t i t di n f i si er est e = ' ,
max) ;
r eadl n
end.
ATESTAT - 2003 - 30 - S se scrie la sfritul fiierului
text DIV.TXT toi divizorii naturali ai numrului ntreg x.
Probleme rezolvate de programare Subiecte propuse la ATESTAT
74
Rezolvare: Folosim algoritmul de verificare a primalitii
unui numr ntreg.
Program ATESTAT_2003_30 ;
VAR
f : f i l e of i nt eger ;
x, d, di vi z : i nt eger ;
Begin { PROGRAM PRINCIPAL }
ASSI GN ( f , ' C: \ DI V. TXT' ) ;
r ewr i t e ( f ) ;
wr i t e ( ' Dat i x = ' ) ;
r eadl n ( x) ;
x : = ABS ( x) ; {daca x est e negat i v i l
f acem> 0 }
di vi z : = 1;
whi l e di vi z <= x do
begi n
i f x MOD di vi z = 0 t hen
wr i t e ( f , di vi z ) ;
di vi z : = di vi z + 1
end;
Probleme rezolvate de programare Subiecte propuse la ATESTAT
75
RESET ( f ) ;
wr i t el n ( ' Ci t i mf i si er ul ' ) ;
whi l e not EOF ( f ) do
begi n
r ead ( f , d) ;
wr i t el n ( ' Di vi zor = ' , d)
end;
r eadl n
end.
ATESTAT - 2003 - 31 - S se determine toate modalitile
de plat a unei sume S (S >= 0 i S <= 1.000.000) cu
bancnote de valoare dat: b1 =1000, b2 =5000, b3 =
10.000, b4 =100.000.
Rezolvare:
Varianta 1
Program
ATESTAT_2003_31_Bancnote_1_Platile_unei_sume_Bac
kTracking ;
uses CRT;
VAR
s : ar r ay [ 0. . 20] of i nt eger ;
f , b : ar r ay [ 1. . 20] of i nt eger ;
{f [ poz] = numar ul
de bancnot e de t i pul b
[ poz] }
nr sol , Suma, m, poz, i , j : i nt eger ; {m =
numarul de tipuri de bancnote }
{poz = pozi t i a
unei bancnot e i n suma}
Begin { PROGRAM PRINCIPAL }
cl r scr ;
nr sol : = 0;
wr i t e ( ' Dat i o suma < 1. 000. 000, Suma =
' ) ;
r eadl n ( Suma) ;
wr i t e ( ' Ci t e t i pur i de bancnot e f ol osi t i ,
( l a noi m= 4) m= ' ) ;
Probleme rezolvate de programare Subiecte propuse la ATESTAT
76
r eadl n ( m) ;
f or i : = 1 t o mdo
begi n
wr i t e ( ' Dat i val oar ea bancnot ei de
t i pul ' , i , ' b [ ' , i , ' ] =' ) ;
r eadl n ( b[ i ] )
end;
s[ 0] : = 0;
f [ 1] : = 0;
poz : = 1;
while poz > 0 do
begi n
while ( poz <= m) AND ( f [ poz] *
b[ poz] < Suma - s[ poz- 1] ) do
begi n
f [ poz] : = f [ poz] + 1;
s[ poz] : = s[ poz- 1] +
f [ poz] * b[ poz] ;
I F s[ poz] = Suma t hen
begi n
i f poz > 1 t hen
begi n
nr sol : =
nr sol + 1;
wr i t el n
( ' Sol ut i a nr . ' , nr sol ) ;
wr i t e (
Suma, ' = ' , f [ 1] , '
* ' , b[ 1] ) ;
f or j : = 2
t o poz do
begi n
wr i t e ( ' + ' , f [ j ] , ' * ' , b[ j ] )
end;
end
end
Probleme rezolvate de programare Subiecte propuse la ATESTAT
77
ELSE
begi n
poz := poz + 1;
{PAS INAINTE}
f [ poz] : = 0;
{f [ poz] : = f [ poz- 1] - 1; }
end { f [ poz] >= f
[ poz- 1] }
end; {sf ar si t WHI LE i nt er i or }
poz := poz-1; {PAS
INAPOI}
end; { sf ar si t WHI LE ext er i or }
r eadl n
end.
Varianta 2
Program
ATESTAT_2003_31_Bancnote_2_Platile_unei_sume_Bac
kTracking;
t ype
st i va = ar r ay[ 1. . 100] of l ongi nt ;
var
st , a, b: st i va;
n, k, s, i : Longi nt ;
as, ev: bool ean;
Procedure Init ( k: i nt eger ; var st : st i va) ;
begi n
st [ k] : = - 1
End;
Procedure Succesor ( var as: bool ean; var st :
st i va; k: i nt eger ) ;
var
s1, i : l ongi nt ;
begi n
i f ( st [ k] < b[ k] ) and ( k <= n) t hen
begi n
s1 : = 0;
f or i : =1 t o k do
s1 : = s1 + st [ i ] * a[ i ] ;
as : = ( s1 < s)
end
Probleme rezolvate de programare Subiecte propuse la ATESTAT
78
el se
as : = f al se;
i f as t hen
st [ k] : = st [ k] + 1
End;
Procedure Valid ( var ev: bool ean; st : st i va; k:
i nt eger ) ;
var i : i nt eger ;
begi n
ev : = t r ue
End;
Function Solutie( k: i nt eger ) : bool ean;
var i , s1: l ongi nt ;
begi n
s1 : = 0;
f or i : = 1 t o k do
s1 : = s1 + st [ i ] *a[ i ] ;
sol ut i e : = ( s=s1)
End;
Procedure Scrie;
var i : i nt eger ;
begi n
wr i t el n ( s, ' l ei se pl at esc cu: ' ) ;
Probleme rezolvate de programare Subiecte propuse la ATESTAT
79
f or i : = 1 t o k do
begi n
i f st [ i ] >0 t hen
wr i t el n ( st
[ i ] : 2, ' de ' , a[ i ] , '
l ei ' ) ;
end;
wr i t el n ( ' - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - - - ' ) ;
r eadl n
End;
Begin { PROGRAM PRINCIPAL }
n : = 4;
a[ 1] : = 1000;
a[ 2] : = 5000;
a[ 3] : = 10000;
a[ 4] : = 100000;
wr i t e ( ' Suma = ' ) ; r eadl n ( s) ;
f or i : = 1 t o n do
begi n
b[ i ] : = s di v a[ i ]
end;
k : = 1;
Init (k, st);
whi l e ( k > 0) do
begi n
r epeat
succesor (as, st, k);
i f as t hen
valid (ev, st, k);
unt i l ( not as) or ( as and
ev) ;
i f as t hen
i f solutie (k) t hen
SCRIE
el se
begi n
k : = k+1;
init (k, st);
end
el se
Probleme rezolvate de programare Subiecte propuse la ATESTAT
80
k : = k- 1
end;
r eadl n
END.
ATESTAT - 2003 - 32 - S se parcurg, prin sritura
calului, o tabl de ah, netrecnd de dou ori prin aceleai
poziii sau omind o anumit poziie.
Rezolvare:
Program ATESTAT_2003_32_SARITURA_CALULUI ;
uses CRT;
CONST
mmax = 8; { nr . de l i ni i }
nmax = 8; { nr . de col oane }
TYPE
mat r i ce = ARRAY [ 1. . mmax, 1. . nmax] of
i nt eger ; { mat r i cea TABLEI DE SAH }
Probleme rezolvate de programare Subiecte propuse la ATESTAT
81
VAR
SOL : mat r i ce; { SOL = mat r i cea sol ut i i l or
}
{ SOL [ i , j ] = 0 daca nu s-
a t r ecut pr i n pozi t i a ( i , j ) }
{ <> 0 daca s- a
t r ecut pr i n pozi t i a ( i , j ) }
m, n, nr sol , i , j : i nt eger ; { ( i ,
j ) = pozi t i a pe t abl a de sah }
procedure SCRIE;
begi n
wr i t el n;
wr i t el n ( ' Apasat i o t ast a ' ) ;
wr i t el n;
r eadl n;
nr sol : = nr sol + 1;
wr i t el n ( ' Sol ut i a ' , nr sol , ' : ' ) ;
wr i t el n;
f or i : = 1 t o mdo
begi n
f or j : = 1 t o n do
begi n
wr i t e ( ' ' , SOL
[ i , j ] : 3, ' ' ) ;
end;
wr i t el n;
wr i t el n;
end;
r eadl n;
CLRSCR
end; { sf ar si t pr ocedur a SCRI E }
procedure TRASEU ( i , j , pas : i nt eger ) ;
begi n
I F ( i I N [ 1. . m] )
AND ( j I N [ 1. . n] ) t hen
begi n
Probleme rezolvate de programare Subiecte propuse la ATESTAT
82
i f SOL [ i , j ] = 0 t hen
begi n
SOL [ i , j ] : = pas ;
i f pas = m* n t hen
SCRIE
el se
begi n
TRASEU (i-2,
j+1, pas + 1 );
TRASEU (i-1,
j+2, pas + 1 );
TRASEU (i+1,
j+2, pas + 1 );
TRASEU (i+2,
j+1, pas + 1 );
TRASEU (i+2,
j-1, pas + 1 );
TRASEU (i+1,
j-2, pas + 1 );
TRASEU (i-1,
j-2, pas + 1 );
TRASEU (i-2,
j-1, pas + 1 );
end;
SOL [ i , j ] : = 0;
end;
end;
end; { sf ar si t pr ocedur a }
Probleme rezolvate de programare Subiecte propuse la ATESTAT
83
Begin { PROGRAM PRINCIPAL }
CLRSCR;
wr i t e ( ' Dat i numar ul de l i ni i ( cel put i n
5) , m= ' ) ;
r eadl n ( m) ;
wr i t e ( ' Dat i numar ul de col oane ( egal cu
numar ul de l i ni i ) , n = ' ) ;
r eadl n ( n) ;
f or i : = 1 t o mdo
begi n
f or j : = 1 t o n do
begi n
SOL [ i , j ] : = 0
end;
end;
nr sol : = 0;
CLRSCR;
TRASEU (1, 1, 1);
i f nr sol = 0 t hen
wr i t el n ( ' Nu exi st a sol ut i e' ) ;
wr i t el n;
r eadl n
END.
ATESTAT - 2003 - 33 - S se parcurg n lime un graf
neorientat.
Rezolvare:
Varianta 1: Algoritmul este descris n lucrarea Ctlin
Tnase Note de curs, Ediia II, 2008.
Program
ATESTAT_2003_33_Parcurgere_graf_in_latime_BF_Bre
adth_First ;
Probleme rezolvate de programare Subiecte propuse la ATESTAT
84
uses CRT;
VAR
VI ZI TAT : ar r ay [ 1. . 20] of 0. . 1;
{el ement el e vect or ul ui VI ZI TAT sunt :
}
{ = 1, daca un var f a
f ost vi zi t at }
{ = 0, i n caz cont r ar }
A : ar r ay [ 1. . 20, 1. . 20] of i nt eger ; { A =
mat r i cea de adi acent a}
n : i nt eger ; { n = nr . de nodur i }
m: i nt eger ; { m= nr . de muchi i }
i , j : i nt eger ; { i , j = i ndecsi }
v : i nt eger ; { v = var f cur ent }
x, y : i nt eger ; { x, y = ext r emi t at i al e unei
muchi i }
pr i m, ul t i m: i nt eger ;
{ poi nt er i cat r e "pr i mul " / "ul t i mul "
el em. al cozi i }
C : ar r ay [ 1. . 20] of i nt eger ;
{ C = coada i n car e depunemvar f ur i l e
nevi zi t at e, veci ne al e unui var f }
begi n
CLRSCR;
wr i t el n;
wr i t e ( ' Dat i numar ul de var f ur i , n = ' ) ;
r eadl n ( n) ;
wr i t el n;
Probleme rezolvate de programare Subiecte propuse la ATESTAT
85
wr i t e ( ' Dat i numar ul de muchi i , m= ' ) ;
r eadl n ( m) ;
wr i t el n;
f or i : = 1 t o n do
begi n
f or j : = 1 t o n do
begi n
A [ i , j ] : = 0 {i ni t i al i zar e
el ement e mat r i ce de adi acent a cu 0}
end;
end;
wr i t el n;
wr i t el n ( ' Dat i ext r emi t at i l e muchi i l or ' ) ;
wr i t el n;
f or i : = 1 t o mdo
begi n
wr i t el n ( ' Pent r u muchi a ' , i , ' , dat i
ext r emi t at i l e' ) ;
wr i t e ( ' Pr i ma ext r emi t at e, x = ' ) ;
r eadl n ( x) ;
wr i t e ( ' A doua ext r emi t at e, y = ' ) ;
r eadl n ( y) ;
wr i t el n;
A [ x, y] : = 1;
A [ y, x] : = 1;
end;
wr i t el n;
wr i t e ( ' Dat i var f ul de pl ecar e, i = ' ) ;
r eadl n ( i ) ;
wr i t el n;
C [ 1] : = i ; {pr i mul el ement di n coada est e
var f ul de pl ecar e}
f or j : = 1 t o n do
begi n
VI ZI TAT [ j ] : = 0;
end;
pr i m: = 1; {poi nt ar e cat r e pr i mul el ement al
cozi i }
ul t i m: = 1; {poi nt ar e cat r e ul t i mul el ement
al cozi i }
Probleme rezolvate de programare Subiecte propuse la ATESTAT
86
VI ZI TAT [ i ] : = 1;
whi l e pr i m<= ul t i mdo
begi n
v : = C [ pr i m] ;
f or j : = 1 t o n do
begi n
i f ( A [ v, j ] = 1) AND ( VI ZI TAT
[ j ] = 0) t hen
begi n
ul t i m: = ul t i m+ 1;
{se depune un var f i n coada
i n pozi t i a "ul t i m"}
C [ ul t i m] : = j ;
VI ZI TAT [ j ] : = 1;
end; {end I F }
end; {end FOR }
pr i m: = pr i m + 1;
end; {end WHI LE}
Probleme rezolvate de programare Subiecte propuse la ATESTAT
87
wr i t el n ( ' Li st a nodur i l or , i n par cur ger e BF,
pl ecand di n nodul ' , i , ' , est e : ' ) ;
f or j : = 2 t o ul t i mdo
begi n
wr i t e ( C [ j ] , ' ' ) ;
end;
r eadl n
end.
Varianta 2:
Program
ATESTAT_2003_33_Parcurgere_graf_in_latime_cu_pro
cedura_recursiva ;
t ype mat = ar r ay [ 1. . 20, 1. . 20] of i nt eger ;
vect = ar r ay [ 1. . 20] of i nt eger ;
var v : mat ;
t , coada : vect ;
n, k, j , i , p : i nt eger ;
procedure PBF ( i : i nt eger ) ; { Par cur ger e
Breadth First }
{pr ocedur a r ecur si va}
var j : i nt eger ;
begi n
f or j : =1 t o n do
i f ( v [ coada [ i ] , j ] = 1 ) and ( t
[ j ] = 0) t hen
begi n
k : = k+1;
coada [ k] : = j ;
t [ j ] : = 1 ;
end;
i f i <n t hen
PBF ( i +1) ;
end;
Begin { PROGRAM PRINCIPAL }
wr i t e( ' n = ' ) ;
r eadl n( n) ;
f or i : = 1 t o n do
begi n
Probleme rezolvate de programare Subiecte propuse la ATESTAT
88
t [ i ] : = 0;
f or j : = i +1 t o n do
begi n
wr i t e ( ' Legat ur a
i nt r e ' , i , ' si ' , j , ' = ' ) ;
r eadl n ( v[ i , j ] ) ;
v[ j , i ] : = v[ i , j ] ;
end;
end;
wr i t e ( ' Dat i Nodul de plecare, p = ' ) ;
r eadl n ( p) ;
coada [ 1] : = p;
t [ p] : = 1;
k : = 1;
PBF (p);
f or i : =1 t o n do
wr i t e ( coada[ i ] , ' - >' ) ;
wr i t el n;
r eadl n
end.
Probleme rezolvate de programare Subiecte propuse la ATESTAT
89
ATESTAT - 2003 - 34 - S se determine un ciclu ntr-un
graf astfel nct s se treac prin toate punctele grafului, iar
costul drumului s fie minim.
Rezolvare: Se folosete algoritmul cunoscut de
determinare a unui ciclu ntr-un graf.
Program ATESTAT_2003_34_Graf_cost_minim ;
var
A: ar r ay [ 1. . 20, 1. . 20] of i nt eger ;
{mat r i cea de adi acent a}
s: ar r ay [ 1. . 20] of i nt eger ;
n, i , j , v, v1, v2, mi n, cost : i nt eger ;
Begin { PROGRAM PRINCIPAL }
Wr i t e ( ' Dat i numar ul de nodur i , n = ' ) ;
Readl n ( n) ;
wr i t el n ( Dat i mat r i cea de adi acent a A ) ;
f or i : = 1 t o n - 1 do
f or j : = i + 1 t o n do
begi n
wr i t e ( ' Dat i A [ ' , i , ' ,
' , j , ' ] = ' ) ;
r eadl n ( A [ i , j ] ) ;
A [ j , i ] : = A [ i , j ]
end;
f or i : =1 t o n do
begi n
S [ i ] : = 0; {mat r i cea de
adi acent a est e pat r at i ca, avand t oat e}
A [ i , i ] : = 0 {el ement el e
di agonal ei pr i nci pal e egal e cu zer o }
end;
wr i t e ( ' Dat i Nodul de pornire, v = ' ) ;
r eadl n ( v) ;
S [ v] : = 1;
v2 : = v;
cost : = 0;
wr i t el n ( v) ;
Probleme rezolvate de programare Subiecte propuse la ATESTAT
90
f or i : = 1 t o n- 1 do
begi n
mi n : = 30000;
f or j : = 1 t o n do
i f ( A [ v2, j ] <> 0) and ( S [ j ] = 0)
and ( mi n > A [ v2, j ] ) t hen
begi n
mi n : = A [ i , j ] ;
v1 : = j
end;
v2 : = v1;
S [ v2] : = 1;
cost : = cost + mi n;
wr i t e ( v1, ' - > ' ) ;
end;
cost : = cost + A [ v2, v] ;
wr i t el n ( v) ;
wr i t el n ( ' Cost t ot al = ' , cost ) ;
r eadl n
end.
Probleme rezolvate de programare Subiecte propuse la ATESTAT
91
ATESTAT - 2003 - 35 - S se afieze toate posibilitile de
aranjare pe o caset a n melodii, codificate cu numere de
la 1 la n, astfel nct melodia X s urmeze dup melodia Y
(x i y sunt dou valori citite). Se consider n < 10.
Rezolvare:
Program ATESTAT_2003_35_Caseta_cu_melodii ;
uses cr t ;
const nmax = 100;
t ype vect or = ar r ay [ 1. . nmax] of i nt eger ;
var f : vect or ;
SOLUTI I : TEXT; {f i si er t ext de pe di sc
i n car e vomr et i ne sol ut i i l e}
sol , n, i , x, y : i nt eger ;
procedure VERIFICA ( k : i nt eger ; f : vect or ;
VAR CONTI N : bool ean ) ;
LABEL 10;
begi n
CONTI N : = TRUE;
f or i : = 1 t o k - 1 do
begi n
i f f [ i ] = f [ k] t hen
begi n
CONTI N : = FALSE;
GOTO 10
end;
end;
10: end;
procedure SCRIE ;
begi n
sol : = sol + 1;
wr i t e ( ' Sol ut i a nr . ' , sol , ' ' ) ;
f or i : = 1 t o n do
begi n wr i t e ( f [ i ] : 3 ) ; wr i t e
( SOLUTI I , f [ i ] : 3 ) ; end;
wr i t el n ( SOLUTI I ) ; wr i t el n {Li ni e de
spat i er e}
end;
function POZMELODIE ( x, y : i nt eger ) : BOOLEAN;
Probleme rezolvate de programare Subiecte propuse la ATESTAT
92
Var OK : bool ean;
begi n
OK : = FALSE;
f or i : = 1 t o n - 1 do
begi n
i f ( f [ i ] = y) AND ( f [ i + 1 ]
= x ) t hen
OK : = TRUE;
end;
POZMELODI E : = OK
end;
procedure PERMUTA ( m: i nt eger ) ;
LABEL 20;
var k : i nt eger ;
CONTI N : bool ean;
Probleme rezolvate de programare Subiecte propuse la ATESTAT
93
begi n
k : = 1;
f [ k] : = 0;
while k > 0 do
begi n
CONTI N : = FALSE;
while f [ k] < mdo
begi n
f [ k] : = f [ k] + 1;
VERIFICA (k, f, CONTIN);
i f CONTI N = TRUE t hen
GOTO 20
end; {sf ar si t WHI LE i nt er i or }
20: i f ( CONTI N = TRUE ) AND ( k = n)
t hen
begi n
i f POZMELODIE (x, y) = TRUE
t hen
SCRIE;
end;
i f ( CONTI N = TRUE ) and ( k < n)
t hen
begi n
k : = k + 1; {PAS
INAINTE}
f [ k] : = 0
end;
i f CONTI N = FALSE t hen
k : = k - 1 {PAS
INAPOI}
end; {sf ar si t WHI LE ext er i or }
end; {sf ar si t pr ocedur a PERMUTA}
Begin { PROGRAM PRINCIPAL }
cl r scr ;
assi gn ( SOLUTI I , ' C: \ SOLUTI I . t xt ' ) ;
{Sol ut i i l e se vor scr i e si i n
f i si er ul C: \ SOLUTI I . TXT}
Probleme rezolvate de programare Subiecte propuse la ATESTAT
94
r ewr i t e ( SOLUTI I ) ;
sol : = 0;
wr i t e( ' Dat i nr . de
mel odi i ( < 10 ) n = ' ) ;
r eadl n ( n) ;
wr i t e ( ' Dat i mel odi a nr .
x = ' ) ;
r eadl n ( x) ;
wr i t e ( ' Dat i mel odi a nr .
y = ' ) ;
r eadl n ( y) ;
wr i t el n;
PERMUTA (n);
i f sol = 0 t hen
wr i t el n ( ' Nu exi st a
sol ut i e' ) ;
r eadl n
end.
De exemplu, pentru n =5
X =3
Y =4
se vor afia pe ecran
(respectiv se vor scrie n fiierul
C:\SOLUTII.TXT)
soluiile:
1 2 4 3 5
1 2 5 4 3
1 4 3 2 5
1 4 3 5 2
1 5 2 4 3
1 5 4 3 2
2 1 4 3 5
2 1 5 4 3
2 4 3 1 5
2 4 3 5 1
2 5 1 4 3
2 5 4 3 1
4 3 1 2 5
4 3 1 5 2
4 3 2 1 5
4 3 2 5 1
4 3 5 1 2
4 3 5 2 1
5 1 2 4 3
5 1 4 3 2
5 2 1 4 3
5 2 4 3 1
5 4 3 2 1

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