You are on page 1of 4

Tehnica Backtracking

Problema Dame
Metoda I
program damele;

{Istrati}

uses crt;
type stiva=array[1..50] of integer;
var st:stiva;
n,k:integer;
as,ev,f:boolean;
procedure init(k:integer;var st:stiva);
begin
st[k]:=0;
end;
procedure next(var as:boolean;var st:stiva;k:integer);
begin
if st[k]<n then begin st[k]:=st[k]+1;as:=true;end
else as:=false;
end;
procedure evalid(var ev:boolean;st:stiva;k:integer);
var i:integer;
begin
ev:=true;
for i:=1 to k-1 do
if (st[k]=st[i]) or (abs(st[k]-st[i])=abs(k-i)) then ev:=false;
end;
function solution(k:integer):boolean;
begin
solution:=(k=n);
end;
procedure tipar;
var i:integer;
begin
for i:=1 to n do write('
end;

',st[i]);writeln;

begin
clrscr;
write('Introduceti numarul de dame n:');readln(n);
writeln('Toate solutiile sint:');
k:=1;f:=true;
while k>0 do begin
repeat next(as,st,k);
if as then evalid(ev,st,k);
until (not as) or (as and ev);
if as then
if solution(k) then begin tipar;f:=false;end
else begin inc(k);init(k,st);end
else dec(k);
end;
if f then writeln('Adica nu sint solutii');
readln;
end.

Problema dame

Metoda II

program dame_dorin;
uses crt;
type stiva=array[1..100] of integer;
var st:stiva;
n,k,i,t:integer;
as,ev:boolean;
begin clrscr;
write('n=');readln(n);
if n<4 then writeln('nu sunt posibile ashezari')
else begin st[k]:=0;
k:=1;
while (k>0) do begin
repeat
if st[k]<n then begin
st[k]:=st[k]+1;
as:=true;
end
else as:=false;
if as then ev:=true;
for i:=1 to k-1 do
if (st[k]=st[i]) or (abs(st[k]-st[i])=abs(k-i)) then
ev:=false;
until (not as) or (as and ev);
if as then
if k=n then begin
for i:=1 to n do write(st[i],' ');
t:=t+1;
writeln;end
else begin
k:=k+1;
st[k]:=0;
end
else k:=k-1;
end;end;
writeln('sunt ',t,' solutii');
readln;
end.

Metoda III
Program damele_olaru;
uses crt,dos;
type tabla=array[1..20] of integer;
var t:tabla;
i,j,n,c,w:integer;
a:array [1..20,1..20] of integer;
ex:boolean;
bh,eh,bm,em,bs,es,bhs,ehs:word;
procedure tipar;
var i:integer;
begin writeln('Solutie :');
for i:=1 to n do
for j:=1 to n do
a[i,j]:=0;
for i:=1 to n do a[i,t[i]]:=i;
for i:=1 to n do begin write('
');
for j:=1 to n do begin
if a[i,j]<>0 then textcolor(14);
write(A[i,j],' ');
ex:=true; textcolor(7);
end;
writeln;
end;
writeln;c:=c+n;w:=w+1;
end;
procedure dame (k:integer);
var i,j:integer;
corect:boolean;
begin
if k=n+1
then begin

tipar;
c:=c+1;

end
else begin
for i:=t[k]+1 to n do begin
t[k]:=i; corect:=true;
for j:=1 to k-1 do
if (t[j]=t[k]) or (abs(t[k]-t[j])=(k-j))
then corect:=false;
if corect then dame (k+1)
end;
end;
t[k]:=0;
end;
begin clrscr; w:=0; ex:=false; c:=0;
write('n='); readln(n);
for i:=1 to n do t[i]:=0;
GetTime(bh,bm,bs,bhs);
dame(1);
GetTime(eh,em,es,ehs);
writeln('Am lucrat : ',(eh-bh)*60*60+(em-bm)*60+es-bs,'.',ehs-bhs,'
sec.');
if not ex then writeln('Nu exista solutii!')
else writeln('Numarul de solutii posibile este : ',w);
readkey;
end.

Metoda IV

const lim=100;
var a:array [1..lim] of integer;
n,i,k:integer;
ok:boolean;
procedure verify;
begin
ok:=true;i:=1;
while ok and (i<k) do
if (abs(a[i]-a[k])=k-i) or (a[i]=a[k]) then ok:=false
else i:=i+1;
end;
procedure tipar;
begin
write('Solutie:');
for i:=1 to n do write(a[i]:3);
writeln;
end;
begin
write('Introduceti n:');readln(n);
k:=1;a[k]:=0;
while k>0 do begin
ok:=false;
while not ok and (a[k]<n) do begin
a[k]:=a[k]+1;
verify;
end;
if ok then if k=n then tipar
else begin
k:=k+1;
a[k]:=0;
end
else k:=k-1;end;
readln;
end.

You might also like