Problema permutarilor Pascal

3
Pentru a rezolva problema permutarilor prin metoda backtracking-ului vom avea nevoie de o functie de tip boolean care va verifica daca cifra de pe pozitia data prezinta este o solutie- candidat buna sau nu (nu este obligatorie dar reduce complexitatea vizuala a programului, devenind mai usor de lucrat), o procedura pentru afisare care la fel nu este mandatorie si o functie care va efectua backtracking-ul propriu zis. type Tab= array[1..25] of integer; var Sir:Tab; i,n,p:integer; function verificare(p:integer):boolean; begin verificare:=true; for i:=1 to p-1 do if sir[i]=st[p] then verificare:=false; end; procedure Afisare; var i:integer; begin for i:=1 to n do writeln(sir[i],' '); end; procedure Backtracking; begin p:=1; {Incepem cu prima pozitie } Sir[p]:=0; {Incepem sirul cu 0}

description

Rezolvarea prin metoda backtracking

Transcript of Problema permutarilor Pascal

Page 1: Problema permutarilor Pascal

Pentru a rezolva problema permutarilor prin metoda backtracking-ului vom avea nevoie de o functie de tip boolean care va verifica daca cifra de pe pozitia data prezinta este o solutie-candidat buna sau nu (nu este obligatorie dar reduce complexitatea vizuala a programului, devenind mai usor de lucrat), o procedura pentru afisare care la fel nu este mandatorie si o functie care va efectua backtracking-ul propriu zis.

type Tab= array[1..25] of integer;

var Sir:Tab;

i,n,p:integer;

function verificare(p:integer):boolean;

 begin

verificare:=true;

for i:=1 to p-1 do

if sir[i]=st[p] then verificare:=false;

end;

procedure Afisare;

var i:integer;

 begin

for i:=1 to n do writeln(sir[i],' ');

end;

procedure Backtracking;

 begin 

p:=1; {Incepem cu prima pozitie }

Sir[p]:=0; {Incepem sirul cu 0}

while p>0 do {Cat timp sirul nu este vid, adica exista, si deci nu au fost epuizate cazurile posibile}

 begin

if Sir[p]<n then {Mai exista valori care nu au fost incercate pe aceasta pozitie}

 begin

Page 2: Problema permutarilor Pascal

Sir[p]:=Sir[p]+1; {Ii atribuim acestei pozitii o alta valoare posibila }

 if Verificare(p)=true then

if p=n then Afisare {solutia este finala si afisata}

 else begin 

p:=p+1;{Daca sirul nu este complet trecem la pozitia urmatoare}

Sir[p]:=0; {initializam pozitia cu 0}

end;

end;

else

p:=p-1; {Daca solutia nu este buna, conform principiul backtracking-ului mergem inapoi pana ce gasim problema}

 end;

end;

begin

 write('n=');

readln(n);

for i:=1 to n do

Sir[i]:=0;

Backtracking;

readln;

end.