Probleme 1

Se dau n multimi fiecare multime avand elementele 1...m. Sa se afiseze produsul cartezian a celor n multime. Afisarea sa se realizeze intr-un fisier.

Exemplu:

n=3 m=4

Solutii:

1 1 1

1 1 2

1 1 3

1 1 4

1 2 1

1 2 2

......

Observam ca valoarea elementului minim de pe fiecare coloana este 1 iar valoarea elementului maxim este m.

Elementul x[k] poate fi adaugat la solutie indiferent de elementele aflate pe pozitiile 1...k-1 din solutie.

Avem solutie daca numarul de elemente din vectorul solutie este egal cu numarul multimilor (n).

var x:array[1..50]of byte;
k,n,m:byte;valid:boolean; f:text;
procedure posibil(k:integer;var valid:boolean);{nu exista restrictii la adaugarea elementului x[k]}
begin
valid:=true;
end;
function solutie(k:integer):boolean;{avem solutie daca numarul de elemente din vectorul solutie este egal cu numarul multimilor (n)}
begin
if(k=n) then solutie:=true
         else solutie:=false;
end;
procedure afisare(k:integer);{afisarea vectorului solutie}
var i:byte;
begin
for i:=1 to k do write(f,x[i],' ');
writeln(f);
end;
procedure back;
begin
k:=1;
x[k]:=0;{intializam cu valoarea elementului minim-1}
while(k>0) do begin
           valid:=false; {x[k] nu e valid pentru a fi adaugat in solutie}
           while(not valid)and(x[k]<m) do {cat timp nu s-a gasit un element x[k] valid pentru solutie si mai sunt valori pe care le poate avea x[k]}
           begin
           x[k]:=x[k]+1; {trecem la verificarea urmatoarei valori pentru x[k]}
           posibil(k,valid);
           end;
           if(not valid) then k:=k-1 {daca s-au verificat toate valorile pe care le paote avea x[k] si nu am gasit un element valid ne intoarcem la pozitia elementului anterior si continuam cautarea de aici}
                  else if(solutie(k)) then afisare(k) {daca avem solutie o afisam}
                       else begin {daca am gasit un element x[k] valid si nu am ajuns la o solutie}
                            k:=k+1;
                            x[k]:=0;
                            end;
           end;
end;
begin
write('numarul de multimi=');readln(n);
write('numarul de elemente din fiecare multime=');readln(m);
assign(f,'prod.txt');
rewrite(f);
back;
close(f);
end.
 

Sa se afiseze toate modalitatile de a aranja n obiecte numerotate 1...n. (Generarea permutarilor)

Exemplu:

n=3

Solutiile sunt:

1 2 3

1 3 2

2 1 3

2 3 1

3 1 2

3 2 1

Observam ca:

- valoarea elementului minim este 1 iar valoarea elementului maxim este n

- elementul x[k] nu poate fi adaugat la solutie daca a mai aparut in solutie pe vreuna din pozitiile 1...k-1 (elementul nu se repeta)

- avem solutie cand am reusit sa asezam cele n obiecte

 

var x:array[1..50]of byte;
k,n:byte;valid:boolean; f:text;
procedure posibil(k:integer;var valid:boolean);
var i:integer;
begin
valid:=true; {presupunam ca x[k] poate fi adaugat la solutie}
for i:=1 to k-1 do  {verificam repetitia elementului x[k]: daca a mai aparut in sir x[k] nu poate fi adaugat la solutie}
    if(x[k]=x[i])then valid:=false;
end;
function solutie(k:integer):boolean;
begin
if(k=n) then solutie:=true {avem solutie daca s-au adaugat la solutie n elemente}
         else solutie:=false;
end;
procedure afisare(k:integer);
var i:byte;
begin {afisam vectorul solutie}
for i:=1 to k do write(f,x[i],' ');
writeln(f);
end;
procedure back;
begin
k:=1;
x[k]:=0;
while(k>0) do begin
           valid:=false;
           while(not valid)and(x[k]<n) do
           begin
           x[k]:=x[k]+1;
           posibil(k,valid);
           end;
           if(not valid) then k:=k-1
                  else if(solutie(k)) then afisare(k)
                       else begin
                            k:=k+1;
                            x[k]:=0;
                            end;
           end;
end;
begin
write('numarul de obiecte=');readln(n);
assign(f,'perm.txt');
rewrite(f);
back;
close(f);
end.
 

Se dau n obiecte. Sa se gaseasca toate modalitatile de a aranja intr-un sir m dintre cele n obiecte (generarea aranjamentelor)

Exemplu:

n=4 m=3

Solutii:

1 2 3

1 2 4

1 3 2

1 3 4

1 4 2

1 4 3

2 1 3

2 1 4

2 3 1

2 3 4

2 4 1

2 4 3

3 1 2

3 1 4

3 2 1

3 2 4

3 4 1

3 4 2

4 1 2

4 1 3

4 2 1

4 2 3

4 3 1

4 3 2

Observam ca:

- valoarea minima este 1 si valoarea maxima este n

- avem solutie daca aranjam m obiecte

- x[k] poate fi adaugat la solutie daca nu a mai fost adaugat (elementele din solutie nu se repeta)

var x:array[1..50]of byte;
k,n,m:byte;valid:boolean; f:text;
procedure posibil(k:integer;var valid:boolean);
var i:integer;
begin
valid:=true; {elementele nu se repeta}
for i:=1 to k-1 do
    if(x[k]=x[i])then valid:=false;
end;
function solutie(k:integer):boolean;
begin {avem solutie daca au fost aranjate m obiecte}
if(k=m) then solutie:=true
         else solutie:=false;
end;
procedure afisare(k:integer);
var i:byte;
begin {afisam vectorul solutie}
for i:=1 to k do write(f,x[i],' ');
writeln(f);
end;
procedure back;
begin
k:=1;
x[k]:=0;
while(k>0) do begin
           valid:=false;
           while(not valid)and(x[k]<n) do
           begin
           x[k]:=x[k]+1;
           posibil(k,valid);
           end;
           if(not valid) then k:=k-1
                  else if(solutie(k)) then afisare(k)
                       else begin
                            k:=k+1;
                            x[k]:=0;
                            end;
           end;
end;
begin
write('numarul de obiecte=');readln(n);
write('m=');readln(m);
assign(f,'aranj.txt');
rewrite(f);
back;
close(f);
end.
 


 

Se dau n obiecte numerotate de la 1...n. Sa se gaseasca toate posibilitatile de a aranja cate m obiecte din cele n astfel incat multimile de elemente sa nu se repete.

Exemplu:

n=4 m=3

solutii:

1 2 3

1 2 4

1 3 4

2 3 4

 

Observam ca:

- valoarea elementului minim este 1; valoarea elementului maxim este n

- elementele din solutie nu se repeta

- pentru a nu se repeta multimile de elemente (adica solutia 1 2 3 este aceiasi cu 2 1 3, 1 3 2...) elementele sunt introduse in solutie in ordine crescatoare/descrescatoare. Alegem varianta in care elementele sunt in ordine crescatoare.

- avem solutie cand am introdus in solutie m elemente

var x:array[1..50]of byte;
k,n,m:byte;valid:boolean; f:text;
procedure posibil(k:integer;var valid:boolean);
var i:integer;
begin
valid:=true;

{elementele din solutie nu se repeta}
for i:=1 to k-1 do
    if(x[k]=x[i])then valid:=false;

{multimile de solutii nu se repeta: elementele sunt in ordine crescatoare}
if(k>1) then if(x[k]<x[k-1]) then valid:=false;
end;
function solutie(k:integer):boolean;
begin {avem solutie daca au fost introduse in vectorul solutie m elemente}
if(k=m) then solutie:=true
         else solutie:=false;
end;
procedure afisare(k:integer);
var i:byte;
begin {afisam vectorul solutie}
for i:=1 to k do write(f,x[i],' ');
writeln(f);
end;
procedure back;
begin
k:=1;
x[k]:=0;
while(k>0) do begin
           valid:=false;
           while(not valid)and(x[k]<n) do
           begin
           x[k]:=x[k]+1;
           posibil(k,valid);
           end;
           if(not valid) then k:=k-1
                  else if(solutie(k)) then afisare(k)
                       else begin
                            k:=k+1;
                            x[k]:=0;
                            end;
           end;
end;
begin
write('numarul de obiecte=');readln(n);
write('m=');readln(m);
assign(f,'comb.txt');
rewrite(f);
back;
close(f);
end.
 

 

counter for wordpress

View My Stats