Backtracking
Descriere referat
| Referate informatica | Bac 2008 informatica | Recomanda unui prieten
1.Sa se plaseze pe o tabla de sah 8 dame astfel incat sa nu se atace reciproc.Sa se genereze toate solutiile.
Comentariu:
Pe fiecare linie trebuie sa stea o singura dama.Procedura pune_dama are ca parametru linia pe care trebuie sa se aseze o dama astfel incat san u fie atacata de damele pozitionate anterior.Pentru fiecare pozitie corecta gasita,procedura se autoapeleaza pentru linia urmatoare.
program dame;
const nmax=20;
var n,i,j:byte;
a:array[1..nmax] of 0..nmax;
nrs:byte;
procedure afis;
var i,j:byte;
begin
for i:=1 to n do begin
for j:=1 to n do
if a=j then write(‘* ‘);
else write(‘0 ‘);
writeln
end;
nrs:=nrs+1;
end;
procedure pune_dama(x:byte);
var I,j,:byte;v:boolean;
begin
if x>n then afis else for i:=1 to n do
begin
v:=true;
for j:=1 to x-1 do
if a[j]=I or abs(j-x)=abs(a[j]-i) then
v:=false;
if v then begin
a[x]:=I;
pune_dama(x+1);
end;
end;
end;
begin
write(‘introduceti dimensiunea tablei de sah:’);readln(n);
nrs:=0;
pune_dama(1);
writeln(‘numarul de solutii :’,nrs);
end.
2.Se dau n tipuri de monezi.Sa se plateasca o suma data s,folosind un numar minim de monezi din tipurile date.Se considera ca exista un numar sufficient de monezi dn fiecare tip.
Comentariu:
Procedura rec primeste ca parametru un tip de moneda si incearca sa-l foloseasca pentru plata sumei ramase pana la momentul current,pornind de la numarul maxim de monezi pe care il poate folosi si pana la 0,procedura apelandu-se recursive pentru moneda urmatoare.
program factura;
const nmax=100;
var i,n,s:byte;
a,b,bm:array[1..nmax] of byte;
nr,nrm:byte;
procedure rec(x:byte);
var i:integer;
begin
if nr<=nrm or nrm=0 then
begin
if x>n then
begin
if s=0 and nr<=nrm or nrm=o then
begin
bm:=b;
nrm:=nr;
end;
end else for i:=s div a[x] downto 0 do begin
s:=s-a[x]*i;
b[x]:=i; nr:=nr+i;
rec(x+1);
s:=s+a[x]*i;
nr:=nr-i;
end
end;
end;
begin
write(‘intoduceti numarul de tipuri de monezi:’);readln(n);
writeln(‘introduceti valorile monezilor:’);
for i:=1 to n do read( a);
write(‘introduceti suma de platit:’);readln(s);
nr:=0; nrm:=0;rec(1);
if nrm=0 then begin
if s=0 then writeln(‘factura nu trebuie platita’)
else writeln(‘nu se poate plati suma data’);
end else begin
writeln(‘numarul minim de monezi este:’,nrm);
for i:=1 to n do if bm<>0 then
writeln (bm,’monezi de ‘,a, ‘ lei’);
end
end.
3.Se considera o stiva de case de bani sub forma de piramida .Astfel pe primul nivel vor fi n case ,pe urmatorul n-1 ,apoi n-2 ,…pana la ultimul nivel unde va fi o singura casa de bani.Deci fiecare casa se va sprijini pe doua case din etajul anterior ,in total fiind n(n+1)/2 case de bani.
Se dau n(n+1)/2 saci cu bani,fiecare continand o anumita suma .Sa se distribuie acseti saci ,fiecare intr-o casa,astfel incat in fiecare casa sa fie tot atatia bani cat pe celelalte doua case pe care se sprijina la un loc.Pentru casele din stratul de baza nu exista nici o restrictie.
Datele vor fi citite dintr-un fisier alcarui nume este intreodus de la tastatura,cu urmatorul format:
n
s1,s2,s3……………………sn(n+1)/2
unde n este numarul de cutii din stratul de baza ,iar s1,s2… sunt sumele de bani din fiecare sac.Rezultatul va fi afisat p[e ecran sub forma unei piramide in care sunt trecute sumele de banio din fiecare casa.
Program saculeti;
const nmax=100;
var s:string;f:text;ver:Boolean;
I,j,t,n,m:integer;
b:array[1..nmax*(nmax+1) div 2] of integer;
a:array[1..nmax,1..nmax] of integer;
procedure afis;
var I,j:integer;
begin
for i:=1 to n do begin
for j:=1 to n-i div 2 do write(‘ ‘);
if odd(n-i) then write(‘ ‘);
for j:=1 to i do write (a[i,j]:6);
writeln;
end;
end;
procedure pune(s:integer);
var i,j:byte;
begin
if s>m then begin afis;end else begin
for i:=1 to n do for j:=1 to i do
if a[i,j]=0 then begin
ver:=true;
if i>1 then begin
if j0) and (a[i-1,j]<>b[s]+a[i,j+1])
the ver:=false;
if j>1 then
if (a[i,j-1]=0 and a[i-1,j-1]<=b[s] or a[i,j-1]<>0) and (a[i-1,j-1]<>b[s]+a[i,j-1]) then ver:=false;
end;
if ver then begin
a[i,j]:=b[s];
pune(s+1);a[i,j]:=0;
end end end end;
begin
write(‘introduceti numele fisierului:’);readln(s);
assign(f,s);reset(f);
read(f,n);m:=n*(n+1) div 2 ;
for i:=1 to *(n+1) div 2 do read (f,b);
close(f);
for i:=1 to m-1 do
for j:=i+1 to m do
if bt:=b;b:=b[j];b[j]:=t;
end;
pune(1);
writeln(‘nu exista solutie’);
end.
4.Se da o lista formata din n cuvinte .Sa se formeze cu ele cel mai lung sir in care fiecare cuvant incepe cu litera cu care se termina predecesorul sau (mai putin primul cuvant care poate fi oarecare ).Datele se citesc dintr-un fisier al carui nume se inroduce de la tastatura,cu urmatorul format:
n
c1
c2
c3
.
.
.
cn
unde n-=numarul de cuvinte si c1.. cn cuvintele.
Comentariu:
Vom memora intr-un tablou separat ultima litera a fiecarui cuvant ,iar in alt tablou cuvintele care incep cu o litera pereche(perechea c,d-in c numarul de cuvinte care incep cu litera de cod i,iar in d-lista acestor cuvinte).
program cuvinte;
const nmax=30;
var
a:array[1..nmax] of string;
b:array[1..nmax] of byte;
c:array[0..255] of byte;
d:array[0..255,1..nmax] of byte;
e:array[1..nmax] of boolean;
sol,solm:array[0..nmax] of byte;
nrm;byte;
f:text;s:string;
i,j,n:byte;
procedure rec (x:integer);
var i:integer;sfarsit:boolean;ulti:byte;
begin
if x=1 then
for i:=1 to n do begin
e:=true;sol[x]:=i;
rec(x+!);
e:=false;
end
else begin
sfarsit:=true;ultimalitera:=b[sol[x-1]];
for i:=1 to c[ulti] do
if not e[d[ulti,i]] then begin
sfarsit:=false; e[d[ulti,i]]:=true;
sol[x]:=d[ulti,i];
rec(x+1);
e[d[ulti,i]]:=false
ens;
if sfarsit then if x-1>nrm then begin
solm:=sol;nrm:=x-1
end
end
end;
begin
write(‘intorduceti nume;le fisierului:’);readln(s);
assign(f,s);reset(f);
readln(f,n);
for i:=1 to n do readln (f,a);
for i:=0 yo 255 do c:=0;
for i:=1 to n do begin
b;=ord (a[length(a)]);
inc(c[ord(a[i,1])]);
d[ord(a[i,1]),c[ord(a[i,1])])]]:=i;
Descarca referat
| Adaugat de danionutrazvan | 285 descarcari | 1364 afisari
Referatul Backtracking - informatica pe care doriti sa-l downloadati face parte din referatele gratuite ale siteului.
In cazul in care apar erori de orice fel, sau daca doriti sa reclamati un material ca fiind plagiat ori de o calitate inacceptabila, ne puteti contacta oricand accesand pagina de Contact a site-ului.
