Documente Academic
Documente Profesional
Documente Cultură
5) Utilizând Metoda Backtracking Sunt Generate În
5) Utilizând Metoda Backtracking Sunt Generate În
12345
12
123
124
214
23=> BC
Probleme
Problema reginelor
Type vector= array[1..30] of integer;
Var x:vector;
n:integer;
Procedure solutie;
Var I,j : integer;
Begin writeln;
for i:= 1 to n do
Begin
for j:= 1 to n do
if x[i]= j then write (*)
else write (_);
writeln
End;
Function continuare ( k:integer) : boolean
Var i: integer; ok: boolean;
Begin ok:=true;
for i:= 1 to k-1 do
if (x[k]-x[i]=(k-i))
then ok:=false;
Continuare:= ok;
End.
Saritura calului
Type vector=array[1..400] of integer;
matrice=array[1..20, 1..20] of integer;
Const dx:array [1..8] of integer;
dy:array[1..8] of integer;
A: matrice {tabla de sah}
x,y: vector;
n:integer;
Procedure solutie;
Var I,j:integer;
Begin writeln;
for i:=1 to n do
Begin
for j:=1 to n do
Write (A[I,j] , );
Writeln;
End;
End;
Function continuare (k:integer):boolean;
Begin
If( x[k]<1) or (x[k]>n)
Or (y[k]<1) or (y[k]>n)
Or ( A[x[k], y[k]]>0)
Then ok:= false;
Continuare:=ok;
End;
End;
End;
End;
Begin
write (n=); readln(n);
back(1);
Readln ;
End.
Generarea combinarilor
Fiind date doua numere naturale n si k , sa se genereze
toate combinarile de n elemente luate cate k.
program RIV_6;
{combinari de n cate k
ne-recursiv}
type vector=array [1..25] of integer;
var st:vector; n,k:integer;
{st=vectorul stiva}
procedure initializari ;
{initializeaza stiva si
citeste n si k }
var i:integer;
begin
repeat
procedure back;
{implementeaza algoritmul nerecursiv de backtracking}
var p:integer;
{varful stivei}
begin
p:=1; st[p]:=0;
{initializam primul nivel}
while p>0 do
{cat timp stiva nu devine din
nou vida}
begin
if st[p]<n then
{daca mai exista vreo
valoare neicercata oe nivelul p}
begin
{punem pe nivelul p urmatoarea valoare din
multimea solutiilor posibile}
st[p]:=st[p]+1;
if valid(p) then
{daca solutia (st[1],
st[2],...,st[p]) este valida}
if p=k then
{daca solutia esti si
finala}
tipar(p)
{tiparim solutia}
else
begin
p:=p+1; st[p]:=0;
{trecem la
nivelul urmator, pe care il re-initializam}
end;
end
else
{adica pe nivelul p nu se
mai poate incerca nici o valoare}
p:=p-1;
{pasul inapoi la nivelul
anterior}
end;
end;
begin
initializari;
back;
end.
Generarea aranjamentelor
procedure tipar;
var i:integer;
begin
for i:=1 to p do write (st[i]);
writeln
end;
begin
write('N='); readln(n);
write ('P='); readln(p);
k:=1; init (k,st);
while (k>0) do
begin
repeat
succesor(as,st,k);
if as then valid(ev,st,k);
until (not as) or (as and ev);
if as then
if solutie(k)
then tipar
else begin
k:=k+1;
init(k,st)
end
else k:=k-1
end
end.
begin
clrscr;
write('cate tipuri de bacnote avem? ');
readln(n);
write('suma='); readln(s);
for i:=1 to n do
begin
write('valoarea monedei de tipul', i,' ');
readln (a[i]);
b[i]:=s div a[i];
sol[i]:=-1;
end;
plata(1,0);
end.
Programul principal :
program backtracking;
type vector=array[1..25] of integer;
var st:vector; n:integer; {sv=vectorul
stiva}
procedure initializari; {initializeaza stiva si
citeste n}
var i:integer;
begin
write ('n='); readln (n);
for i:=1 to 25 do st[i]:=0;
end;
procedure tipar (p:integer); {tipareste o
solutie memorata in vectorul st}
var j:integer;
begin
for j:=1 to p do write (st[j]:4,' ');
writeln;
end;
function valid (p:integer): boolean;
{testeaza daca valoarea st[p] a generat o
solutie valida , returnand true sau false}
var i:integer; ok:boolean;
begin
{valoarea st[p], de pe nivelul p, nu trebuie
sa se mai gaseasca pe nici unul din nivelele
anterioare 1,2,...,p-1}
ok:=true;
for :=1 to p-1 do
if st[p]=st[i] then ok:=false;
valid:=ok;
end;