You are on page 1of 25

1.Fiind dat un numar n citit de la tastatura se cere sa se genereze si sa se afiseze toate permutarile de ordinul n.

program permutari; type vector=array [1..100] of byte; var s:vector; n,k:byte; as,ev:boolean; procedure init(var s:vector;k:byte); begin s[k]:=0 end; procedure succesor(var s:vector;var as:boolean;k:byte); begin as:=false; if s[k]<n then begin inc(s[k]); as:=true; end; end; procedure valid(s:vector;var ev:boolean;k:byte); var i:byte; begin ev:=true; for i:=1 to k-1 do if s[i]=s[k] then ev:=false; end; function solutie(s:vector;k:byte):boolean; begin solutie:=(k=n); end; procedure tipar(s:vector); var i:byte; begin for i:=1 to n do write(s[i]); writeln; end; begin{main} write('n='); readln(n); k:=1; init(s,k); while k>0 do begin

repeat succesor(s,as,k); if as then valid(s,ev,k); until not as or (as and ev); if as then if solutie(s,k) then tipar(s) else begin inc(k); init(s,k); end else dec(k); end; readln; end. Procedura INIT are rolul de a atribui elementului de pe pozitia k din vectorul s valoarea 0 care reprezinta predecesorul celui mai mic element din multimea Ai. Procedura SUCCESOR verifica daca mai exista in multimea Ak un element disponibil si netestat. Procedura VALID verifica singura conditie de continuare impusa de aceasta problema, respective ca o permutare sa aiba elementele distincte. Functia SOLUTIE va returna valoarea TRUE considerand ca s-a obtinut o solutie atunci cand si ultimul element din vector (cel de pe pozitia n) a fost validat. Procedura TIPAR afiseaza pe o linie elemntele vectorului s. 2.Fiind date 2 numere citite de la tastatura , n si p , se cere sa se genereze si sa se afiseze toate aranjamentele de n luate cate p. program aranjamente; type vector=array [1..100] of byte; var s:vector; n,k,p:byte; as,ev:boolean; procedure init(var s:vector;k:byte); begin s[k]:=0 end; procedure succesor(var s:vector;var as:boolean;k:byte); begin as:=false; if s[k]<n then begin inc(s[k]);

as:=true; end; end; procedure valid(s:vector;var ev:boolean;k:byte); var i:byte; begin ev:=true; for i:=1 to k-1 do if s[i]=s[k] then ev:=false; end; function solutie(s:vector;k:byte):boolean; begin solutie:=(k=p); end; procedure tipar(s:vector); var i:byte; begin for i:=1 to p do write(s[i]); writeln; end; begin{main} write('n='); readln(n); write('p='); readln(p); k:=1; init(s,k); while k>0 do begin repeat succesor(s,as,k); if as then valid(s,ev,k); until not as or (as and ev); if as then if solutie(s,k) then tipar(s) else begin inc(k); init(s,k); end else dec(k);

end; readln end. La acest program difera functia SOLUTIE (in locul conditiei k=n se va verifica k=p pentru ca o solutie are doar p elemente. Procedura TIPAR , tiparirea se va face cu un for care are valoarea egala cu p, iar in programul principal se va mai citi si valoarea lui p. 3.Fiind date 2 numere citite de la tastatura, n si p , se cere sa se genereze si sa se afiseze toate combinarile de n luate cate p. program combinari; type vector=array[1..100]of byte; var s:vector; n,k,p:byte; as,ev:boolean; procedure init(var s:vector; k:byte); begin s[k]:=k-1; end; procedure succesor(var s:vector; as:boolean; k:byte); begin as:=false; if s[k]<n-p+k then begin inc(s[k]); as:=true; end; end; procedure valid(s:vector; var ev:boolean; k:byte); begin ev:=true; if (k>1)and(s[k]<=s[k-1])then ev:=false; end; function solutie(s:vector; k:byte):boolean; begin solutie:=(k=p); end; procedure tipar(s:vector); var i:byte; begin for i:=1 to p do write(s[i]); writeln end;

begin{main} write('n='); readln(n); write('p='); readln(p); k:=1; init(s,k); while k>0 do begin repeat succesor(s,as,k); if as then valid(s,ev,k); until not as or (as and ev); if as then if solutie(s,k)then tipar(s) else begin inc(k); init(s,k); end else dec(k); end; end. In procedura INIT s[k] va fi initializat cu k-1, procedura SUCCESOR va fi diferita de cea a aranjamentelor prin if s[k]<n-p+k 4.Fiind data o tabla de sah de dimensiuni n*n se cere sa se plaseze pe aceasta n regine astfel incat sa nu se atace. program regina; type vector=array[1..100]of byte; var s:vector; f:text; n,k,nrsol:byte; as,ev:boolean; procedure init(var s:vector; k:byte); begin s[k]:=0; end; procedure succesor(var s:vector; as:boolean; k:byte); begin as:=false; if s[k]<n then begin inc(s[k]); as:=true; end; end; procedure valid(s:vector; var ev:boolean; k:byte);

var i:byte; begin ev:=true; for i:=1 to k-1 do if (s[i]=s[k])or(abs(k-1)=abs(s[k]-s[k-1])) then ev:=false; end; function solutie(s:vector; k:byte):boolean; begin solutie:=(k=n); end; procedure tipar(s:vector); var i,j:byte; begin inc(nrsol); writeln(f,'solutia ',nrsol); for i:=1 to n do begin for j:=1to n do if s[i]=j then write(f,'R') else write(f,'*'); writeln(f); end; end; begin{main} write('n='); readln(n); nrsol:=0; assign(f,'regine.out'); rewrite(f); k:=1; init(s,k); while k>0 do begin repeat succesor(s,as,k); if as then valid(s,ev,k); until not as or (as and ev); if as then if solutie(s,k)then tipar(s) else dec(k); end; readln; end.

Pentru a rezolva aceasta problema se face urmatoarea conventie s[i]=j adica regina cu numarul de ordin I se afla pe linia j. Acasta conventie elimina posibilitatea plasarii a doua regine pe aceeasi linie=> indici distincti=linii distincte. 5.Un comis voiajor trebuie sa viziteze n orase. Initial, el se afla in orasul cu numarul 1.Cunoscand drumurile care leaga cele n orase sa se gasesca toate drumurile pe care sa le parcurga comis voiajorul astfel incat sa treaca prin fiecare oras o singura data si in final sa revina in orasul 1. program comisvoiajor; type vector=array [1..100] of byte; matrice=array [1..100,1..100] of byte; var s:vector; a:matrice; n,k:byte; as,ev:boolean; procedure citire; var f:text; x,y:byte; begin assign(f,'comis.in'); reset (f); readln(f,n); while not eof(f) do begin readln(f,x,y); a[x,y]:=1; a[y,x]:=1; end; close(f); end; procedure init(var s:vector; k:byte); begin s[k]:=1; end; procedure succesor(var s:vector;var as:boolean;k:byte); begin as:=false; if s[k]<n then begin inc(s[k]); as:=true; end; end; procedure valid(s:vector;var ev:boolean;k:byte); var i:byte;

begin ev:=true; if (a[s[k-1],s[k]]<>1) then ev:=false; if ev then for i:=2 to k-1 do if s[i]=s[k] then ev:=false; if ev and (k=n) and (a[s[k],1]<>1) then ev:=false; end; function solutie(s:vector;k:byte):boolean; begin solutie:=(k=n); end; procedure tipar(s:vector); var i:byte; begin for i:=1 to n-1 do write(s[i], '->'); writeln(s[n]); end; begin {main} citire; s[1]:=1; k:=2; init(s,k); while k>1 do begin repeat succesor(s,as,k); if as then valid(s,ev,k); until not as or (as and ev); if as then if solutie (s,k) then tipar(s) else begin inc(k); init(s,k); end else dec(k); end; readln;

end. In cazul acestei probleme se foloseste o structura de date auxiliara numita matrice de 0, daca nu exista drum de la I la j adiacenta (matricea drumurilor). A[i,j]= 1, daca exista drum de la i la j

6. Fiind date multimile Ai={1,2,.ei} , i =pentru care valorile ei se citesc din fisierul cartez.in se cere sa se genereze si sa se afiseze pe linii diferite in fisierul cartez.out elementele produdului cartezian A1*A2**An.. program produscartezian; type vector=array[1..100]of byte; var s,e:vector; f:text; n,k,i:byte; as,ev:boolean; procedure citire; var f:text; i:byte; begin assign(f,'cartez.in'); reset(f); readln(f,n); for i:=1to n do readln(f,e[i]); close(f); end; procedure init(var s:vector;k:byte); begin s[k]:=0; end; procedure succesor(var s:vector;var as:boolean;k:byte); begin as:=false; if s[k]<e[k]then begin inc(s[k]); as:=true; end; end; procedure valid(var s:vector;var ev:boolean;k:byte); begin ev:=true; end; function solutie(var s:vector;k:byte):boolean; begin

solutie:=(k=n); end; procedure tipar(s:vector); begin for i:=1 to n do write(s[i]); writeln; end; begin{main} write('n='); readln(n); assign(f,'cartez.out'); rewrite(f); k:=1; init(s,k); while k>0 do begin repeat succesor(s,as,k); if as then valid(s,ev ,k); until not as or (as and ev); if as then if solutie(s,k)then tipar(s) else begin inc(k); init(s,k); end else dec(k); end; end.

7.Fiind data o harta pe care sunt plasate n tari se cere sa se determine toate solutiile de colorare a acestei harti astfel incat fiecare tara sa fie colorata cu o singura culoare , iar 2 tari invecinate sa fie colorate in mod diferit. OBSREVATIE: -Se poate demonstra ca sunt suficiente maxim 4 culori pentru a colora o astfel de harta. -culorile vor fi codificate cu numere cuprinse intre 1 si 4. program harti; uses crt; type vector=array[1..100] of byte; matrice=array[1..100,1..100] of byte;

var s:vector; a:matrice; n,k,nrsol:byte; as,ev:boolean; procedure init(var s:vector;k:byte); begin s[k]:=0; end; procedure citire; var f:text; x,y,i:byte; begin assign(f,'culori.in'); reset(f); readln(f,n); while not eof(f) do begin readln(f,x,y); a[x,y]:=1; a[y,x]:=1; end; close(f); end; procedure succesor(var s:vector;var as:boolean;k:byte); begin as:=false; if s[k]<4 then begin inc(s[k]); as:=true; end; end; procedure valid(s:vector;var ev:boolean;k:byte); var i:byte; begin ev:=true; for i:=1 to k-1 do if (a[i,k]=1) and (s[i]=s[k]) then ev:=false; end; function solutie(s:vector;k:byte):boolean; begin solutie:=(k=n); end; procedure tipar(s:vector); var i:byte;

begin textcolor(white); inc(nrsol); writeln('solutia',nrsol); for i:=1 to n do begin textcolor(s[i]); writeln('tara',i,'-culoarea',s[i]); end; end; begin{main} citire; k:=1; init(s,k); while(k>0) do begin repeat succesor(s,as,k); if as then valid(s,ev,k); until (not as) or (as and ev); if as then if solutie(s,k) then tipar(s) else begin inc(k); init(s,k); end else dec(k); end; readln end. Pentru a rezolva problema aveam nevoie de o matrice numita matricea vecinatatilor care se formeaza dupa urmatoarea regula: 0, tara i nu se invecineaza cu tara j a[i,j]= 1, tara I se invecineaza cu tara j 8.Fiind dat un numar natural n se cere sa se genereze toate descompunerile acestuia ca suma de numere naturale. OBSERVATII: 1.O astfel de descompunere se numeste partitie a numarului. 2.Ordinea termenilor in partitie este importanta. program partitiinr;

type vector=array [1..100] of byte; var s:vector; n,k:byte; suma:word; as,ev:boolean; procedure init(var s:vector;k:byte); begin s[k]:=0; end; procedure succesor(var s:vector;var as:boolean;k:byte); begin as:=false; if s[k]<n-(k-1) then begin inc(s[k]); as:=true; end; end; procedure valid(s:vector;var ev:boolean;k:byte); var i:byte; begin suma:=0; for i:=1 to k do suma:=suma+s[i]; ev:=(suma<=n); end; function solutie(s:vector;k:byte):boolean; begin solutie:=(suma=n); end; procedure tipar(s:vector;k:byte); var i:byte; begin write('n='); for i:=1 to k-1 do write(s[i],'+'); writeln(s[k]); end; begin{main} write('n='); readln(n); k:=1; init(s,k); while k>0 do begin repeat

succesor(s,as,k); if as then valid(s,ev,k); until (not as) or (as and ev); if as then if solutie(s,k) then tipar(s,k) else begin inc(k); init(s,k); end else dec(k); end; readln; end.

Se observa din exemplu ca vectorul solutie are un numar diferit de elemente cuprins intre 1 si n. De asemenea, se observa ca Ak din care s[k] primesc valori sunt diferite si sunt de forma Ak={1,2,3n}. Elementul maxim se calculeaza astfel tinand seama de faptul ca inaintea elementului de pe pozitia k se gasesc in solutie k-1 valori ce au suma minima k-1.

9.Fiind data o suma de bani suma si n tipuri de monede in numar nelimitat se cere sa se determine si sa se afiseze toate posibilitatile de plata a sumei de bani folosind cel putin o moneda din fiecare tip. Exemplu: daca suma=30, n=4 si valorile menedelor :0,2;0,4; si 2 o solutie a problemei ar fi: 30=3*0,2+1*0,4+17*1+6*2. program monede; type vector=array [1..100] of byte; var s,v:vector; n,k:byte; sum,suma:word; as,ev:boolean; procedure init(var s:vector;k:byte); begin s[k]:=0; end;

procedure succesor(var s:vector;var as:boolean;k:byte); begin as:=false; if (k<=n) and (s[k]<suma div v[k]) then begin inc(s[k]); as:=true; end; end; procedure citire; var i:byte; f:text; begin assign(f,'monede.in'); reset(f); readln(f,n); for i:=1 to n do readln(f,v[i]); readln(f,suma); close(f); end; procedure valid(s:vector;var ev:boolean;k:byte); var i:byte; begin ev:=false; sum:=0; for i:=1 to k do sum:=sum+s[i]*v[i]; ev:=(sum<=suma); end; function solutie(s:vector;k:byte):boolean; begin solutie:=((k=n) and (suma=sum)); end; procedure tipar(s:vector;k:byte); var i:byte; begin write('suma='); for i:=1 to n-1 do write(s[i],'*',v[i],'+'); writeln(s[n],'*',v[n]); end; begin{main} citire; k:=1; init(s,k); while k>0 do

begin repeat succesor(s,as,k); if as then valid(s,ev,k); until (not as) or (as and ev); if as then if solutie(s,k) then tipar(s,k) else begin inc(k); init(s,k); end else dec(k); end; readln end. In aceasta problema vectorul solutie va avea n elemente cu urmatoarea semnificatie s[k]=j, care indica faptul ca din monedele de tipul k au fost luate j monede. Utilizam si vectorul v care are acelasi tip cu vectorul s pentru a memora valoarea monedelor v[k]=j, si are semnificatia: moneda de tipul k are valoarea j. 10.Se considera multimea {1,2,3,n}.Se cere sa se genereze toate partitiile acestei multimi. Se spune ca submultimile A1,A2,.,Ak formeaza o paritite a multimii A daca sunt disjuncte 2 cate 2 si daca reuniunea lor este multimea A. *2 multimi sunt disjuncte d aca nu au niciun element comun. program partmult; type vector=array [1..100] of byte; var s:vector; as,ev:boolean; k,n:byte; procedure init(var s:vector;k:byte); begin s[k]:=0; end; procedure succesor(var s:vector;var as:boolean;k:byte); var i,max:byte; begin max:=0; for i:=1 to k-1 do if max<s[i] then

max:=s[i]; as:=false; if s[k]<max+1 then begin inc(s[k]); as:=true; end; end; procedure valid(var s:vector;var ev:boolean;k:byte); begin ev:=true; end; function solutie(s:vector;k:byte):boolean; begin solutie:=(k=n); end; procedure tipar(s:vector); var i,j,max:byte; begin max:=s[1]; for i:=1 to n do if s[i]>max then max:=s[i]; for j:=1 to max do begin write('{'); for i:=1 to n do if s[i]=j then write(i,' '); write('} '); end; end; begin{main} write('n='); readln(n); k:=1; init(s,k); while k>0 do begin repeat succesor(s,as,k); if as then valid(s,ev,k); until (not as) or (as and ev); if as then if solutie(s,k) then

tipar(s) else begin inc(k); init(s,k); end else dec(k); end; readln; end.

11.Dintr-un grup de n personae dintre care p sunt femei trebuie formata o delagatie de m personae din care l sunt femei.Se cere sa se afiseze toate delagtiile care se pot forma. program delegatii; type vector = array[0 .. 100] of byte; var st : vector; N, P, M, L, K : byte; as, ev : boolean; f, g : text; procedure init (var st : vector; K : byte); begin if K <= L then st[K] := 0 else st[K] := P; end ; procedure succesor (var st : vector; var as : boolean; K : byte) ; begin as := false; if K <= L then begin if st[K] < P then begin inc (st[K]); as := true; end; end else if st[K] < N then

begin inc (st[K]); as := true; end; end ; rocedure valid (st : vector; var ev : boolean; K : byte) ; var i : byte; begin ev := (K = 1) or (st[K - 1] < st[K]); end ; function solutie (st : vector; K : byte) : boolean ; begin solutie := (K = M); end ; procedure tipar (st : vector) ; var i : byte; begin for i := 1 to M do if i <= L then write (g, 'f', st[i], ' ') else write (g, 'b', st[i] - P, ' '); writeln (g); end ; begin {main} assign (f, 'delegatii.in'); reset (f); assign (g, 'delegatii.out'); rewrite (g); readln (f, N, P, M, L); K := 1; init (st, K); while (K > 0) do begin repeat succesor (st, as, K); if (as) then valid (st, ev, K); until (not as) or (as and ev); if (as) then if (solutie (st, K)) then tipar (st) else begin inc (K); init (st, K);

end else dec (K); end; close (f); close (g); end.

12.Se da un numar natural n . Sa se determine toate sirurile de n paranteze care se inchid corect. rogram paranteze; type vector=array [1..100] of shortint; var s:vector; as,ev:boolean; n,k:byte; suma:shortint; procedure init(var s:vector;k:byte); begin s[k]:=-2; end; procedure succesor(var s:vector;var as:boolean;k:byte); begin if s[k]=1 then as:=false else begin as:=true; if s[k]=-1 then s[k]:=s[k]+2 else inc(s[k]); end; end; procedure valid(s:vector;var ev:boolean;k:byte); var i:byte; begin suma:=0; for i:=1 to k do suma:=suma+s[i]; ev:=((suma<=0) and (suma>=-(n-k+1))); end; function solutie(s:vector;k:byte):boolean;

begin solutie:=((k=n) and (suma=0)); end; procedure tipar(s:vector); var i:byte; begin for i:=1 to n do if s[i]=-1 then write('(') else write(')'); writeln; end; begin{main} write('n='); readln(n); k:=1; init(s,k); while k>0 do begin repeat succesor(s,as,k); if as then valid(s,ev,k); until (not as) or (as and ev); if as then if solutie(s,k) then tipar(s) else begin inc(k); init(s,k); end else dec(k); end; readln; end.

13.Avand la dispozitie sase culori:alb,galben,rosu,verde,albastru si negru sa se precizeze toate drapelele tricolore care se pot proiecta stiind ca orice drapel are culoarea din mijloc galben sau verde si cele trei culori de pe drapel sunt distincte.Solutiile afisate trebuie sa contina numele culorilor, nu codul acestora. rogram drapel; type vector = array[0 .. 5] of byte; var st : vector; cul : array[1 .. 6] of string = ('alb', 'galben', 'rosu', 'verde', 'albastru', 'negru'); K, sol : byte; as, ev : boolean; g : text; procedure init (var st : vector; K : byte); begin st[K] := 0; end ; procedure succesor (var st : vector; var as : boolean; K : byte) ; begin as := false; if (st[K] < 6) then begin inc (st[K]); as := true; end ; end ; procedure valid (st : vector; var ev : boolean; K : byte) ; var i : byte; begin ev := true; if (K = 2) and (st[K] <> 2) and (st[K] <> 4) then ev := false; if ev then for i := 1 to K - 1 do if st[i] = st[K] then begin ev := false; break ; end; end ; function solutie (st : vector; K : byte) : boolean ; begin solutie := K = 3; end ;

procedure tipar (st : vector) ; var i : byte; begin inc (sol); write (g, 'Drapelul cu numarul ', sol, ' este : '); for i := 1 to 3 do write (g, cul[st[i]], ' '); writeln (g); end ; begin {main} assign (g, 'drapel.out'); rewrite (g); K := 1; init (st, K); while (K > 0) do begin repeat succesor (st, as, K); if (as) then valid (st, ev, K); until (not as) or (as and ev); if (as) then if (solutie (st, K)) then tipar (st) else begin inc (K); init (st, K); end else dec (K); end; close (g); end.

14.Gasiti toate solutiile de forma (x,y,z)|x,y,z n ale ecuatiei 3x+y+4xz=100. program ecuatie; type vector = array[0 .. 5] of byte; var st : vector; N, K, sol : byte; suma : longint; as, ev : boolean; g : text; procedure init (var st : vector; K : byte); begin

st[K] := 0; end ; procedure succesor (var st : vector; var as : boolean; K : byte) ; begin as := false; if (K <= N) and (st[K] <= 100) then begin inc (st[K]); as := true; end ; end; procedure valid (st : vector; var ev : boolean; K : byte) ; var i : byte; begin suma := 0; for i := 1 to K do case i of 1 : inc (suma, 3 * st[i]); 2 : inc (suma, st[i]); 3 : inc (suma, 4 * st[1] * st[i]); end ; ev := suma <= 100; end ; function solutie (st : vector; K : byte) : boolean ; begin solutie := (suma = 100) and (K = N); end ; procedure tipar (st : vector) ; var i : byte; begin inc (sol); writeln (g, 'Solutia cu numarul ', sol, ' este : '); for i := 1 to N do case i of 1 : writeln (g, 'x = ', st[i]); 2 : writeln (g, 'y = ', st[i]); 3 : writeln (g, 'Z = ', st[i]); end; writeln (g); end ; begin {ala principal} assign (g, 'ecback.out'); rewrite (g);

N := 3; K := 1; init (st, K); while (K > 0) do begin repeat succesor (st, as, K); if as then valid (st, ev, K); until (not as) or (as and ev); if (as) then if (solutie (st, K)) then tipar (st) else begin inc (K); init (st, K); end else dec (K); end; close (g); end.

You might also like