Sie sind auf Seite 1von 14

program Palindroame;

{$APPTYPE CONSOLE}
uses
SysUtils;

type stiva=array[1..30] of integer;
var st:stiva; ams,ev,impar:boolean; k,n,m:integer;

procedure Succesor(var st:stiva; k:integer; var ams:boolean);
begin
if st[k]<m then begin st[k]:=st[k]+1; ams:=true end
else ams:=false
end;

procedure Valid(st:stiva; k:integer; var ev:boolean);
var i:integer;
begin
ev:=true;
for i:=1 to k-1 do if st[i]=st[k] then ev:=false
end;

procedure Tipar;
var i:integer;
begin
if not impar then begin
for i:=1 to n do write(st[i],' ');
for i:=n downto 1 do write(st[i],' ');
writeln end
else begin
for i:=1 to n do write(st[i],' ');
for i:=n-1 downto 1 do write(st[i],' ');
writeln end
end;

begin
Write('Dati lungimea: '); ReadLn(n);
impar:=(n mod 2=1);
n:=n div 2;
if impar then n:=n+1; {pt suprapunere}
Write('Dati limita: '); ReadLn(m);
k:=1; st[k]:=0;
while k>0 do begin
repeat
succesor(st,k,ams);
if ams then valid(st,k,ev)
until (not ams) or (ams and ev);
if ams then if k=n then tipar
else begin k:=k+1; st[k]:=0 end
else k:=k-1
end;
ReadLn
end.







program Labirint;

// Se da o matrice binara unde 0 reprezinta drum liber,
// iar 1 obstacol. Se cere sa se gen toate drumurile
// posibile pentru a iesi din labirint, pornind dintr-o
// pozitie data.

uses
SysUtils;

type mat=array[1..50,1..50] of integer;
sir=array[1..4] of integer;
const dx:sir=(-1,0,1,0);
dy:sir=(0,1,0,-1);
var a:mat; x0,y0,n,i,j:integer; F:Text;

procedure AfisMat(a:mat; n:integer);
var i,j:integer;
begin
for i:=1 to n do begin
for j:=1 to n do Write(a[i,j]:2,' ');
Writeln
end;
WriteLn('-----------'); ReadLn
end;

procedure Lab(var a:mat; x,y,pas:integer);
var xn,yn,i:integer;
begin
for i:=1 to 4 do begin
xn:=x+dx[i]; yn:=y+dy[i];
if (xn in [1..n]) and (yn in [1..n]) and (a[xn,yn]=0) then begin
a[xn,yn]:=pas;
if (xn in [1,n]) or (yn in [1,n]) then AfisMat(a,n)
else Lab(a,xn,yn,pas+1);
a[xn,yn]:=0
end
end
end;

begin
Assign(F,'labirint.txt'); Reset(F);
ReadLn(F,n);
for i:=1 to n do begin
for j:=1 to n do Read(F,a[i,j]);
ReadLn(F) end;
Close(F);
WriteLn('Labirintul este:');
AfisMat(a,n);
Write('Dati pozitia initiala: '); ReadLn(x0);
Write(' '); ReadLn(y0);
a[x0,y0]:=2;
Lab(a,x0,y0,3)
end.







program Cal;

// Sa se genereze toate posibilitatile de a muta un cal
// pe o tabla n x n astfel incat sa fie acoperita toata
// tabla

uses
SysUtils;

type mat=array[0..30,0..30] of integer;
const dx:array[1..8] of integer=(-2,-1,1,2,2,1,-1,-2);
dy:array[1..8] of integer=(1,2,2,1,-1,-2,-2,-1);
var a:mat; x0,y0,n,i,j,sol:integer;

procedure AfisMat(a:mat; n:integer);
var i,j:integer;
begin
for i:=1 to n do begin
for j:=1 to n do Write(a[i,j]:2,' ');
WriteLn
end;
WriteLn('----------'); sol:=sol+1
end;

procedure CalSare(var a:mat; x,y,pas:integer);
var i,xn,yn:integer;
begin
for i:=1 to 8 do begin
xn:=x+dx[i]; yn:=y+dy[i];
if (xn in [1..n]) and (yn in [1..n]) and (a[xn,yn]=0) then begin
a[xn,yn]:=pas;
if pas=n*n then AfisMat(a,n)
else CalSare(a,xn,yn,pas+1);
a[xn,yn]:=0
end
end
end;

begin
sol:=0;
Write('Dati marimea tablei (n x n): '); ReadLn(n);
for i:=1 to n do
for j:=1 to n do a[i,j]:=0;
Write('Dati pozitia de start: '); ReadLn(x0,y0);
a[x0,y0]:=1;
CalSare(a,x0,y0,2);
WriteLn('Solutii: ',sol); ReadLn
end.







program Submultime_de_suma_M;


Se da o multime cu n elemente, si un intreg pozitiv M. Sa se det toate submultimile pt care suma elementelor este M

uses
SysUtils;

type stiva=array[1..50] of integer;
var st:stiva; ams,ev:boolean; k,n,m,i:integer;
val:array[1..50] of integer;

procedure Succesor(var st:stiva; k:integer; var ams:boolean);
begin
if st[k]<1 then begin st[k]:=st[k]+1; ams:=true end
else ams:=false
end;

procedure Valid(st:stiva; k:integer; var ev:boolean);
var i:integer;
begin
ev:=true;
end;

procedure Tipar;
var i,s:integer;
begin
s:=0;
for i:=1 to n do s:=s+st[i]*val[i];
if s=m then begin
for i:=1 to n do if st[i]=1 then write(val[i],' ');
writeln end
end;

begin
Write('N='); ReadLn(n); for i:=1 to n do ReadLn(val[i]);
Write('M='); ReadLn(m);
k:=1; st[k]:=-1;
while k>0 do begin
repeat
succesor(st,k,ams);
if ams then valid(st,k,ev)
until (not ams) or (ams and ev);
if ams then if k=n then tipar
else begin k:=k+1; st[k]:=-1 end
else k:=k-1
end;
ReadLn
end.








program Secv_Realizabile;

{$APPTYPE CONSOLE}

Fie n,m si L=(L1,L2,...,Ln) si C=(C1,...,Cn) doua secv de numere nat. Aceste secv se numesc "realizabile" daca exista o matrice cu n x n elemente din multimea {0,1} astfel incat pe fiecare linie i suma elementelor este L[i], si pe fiecare coloana suma elem este C[j]. Sa se gen pt doua secv date toate matricele cu proprietatea enuntata.


uses
SysUtils;

type matrice=array[1..30,1..30] of integer;
vec=array[1..30] of integer;
var ams,ev:boolean; m,n,i,nrc,nrl:integer;
a:matrice; l,c:vec;

procedure Succesor(var a:matrice; var ams:boolean);
begin
if a[m,n]<1 then begin a[m,n]:=a[m,n]+1; ams:=true end
else ams:=false
end;

procedure Valid(a:matrice; var ev:boolean);
begin
ev:=true;
end;

function Verifica:boolean;
var i,j,s:integer; ok:boolean;
begin
ok:=true; s:=0;
for i:=1 to nrl do begin
for j:=1 to nrc do s:=s+a[i,j];
if s<>L[i] then ok:=false;
s:=0
end; s:=0;
for i:=1 to nrc do begin
for j:=1 to nrl do s:=s+a[j,i];
if s<>C[i] then ok:=false;
s:=0
end;
Verifica:=ok
end;

procedure Tipar;
var i,j:integer;
begin
if Verifica then begin
for i:=1 to nrl do begin
for j:=1 to nrc do write(a[i,j],' ');
writeln
end;
writeln('~~~~~~~~~~~~~~~~~~~~~~~') end
end;

begin
Write('Dati nr linii si nr coloane: '); ReadLn(nrl,nrc);
Write('Sumele pe linii: ');
for i:=1 to nrl do ReadLn(L[i]);
Write('Sumele pe coloane: ');
for i:=1 to nrc do ReadLn(C[i]);

m:=1; n:=1; a[m,n]:=-1;
while (n>0) and (m>0) do begin
repeat
succesor(a,ams);
if ams then valid(a,ev)
until (not ams) or (ams and ev);
if ams then if (m=nrl) and (n=nrc) then tipar
else begin
if n=nrc then begin m:=m+1; n:=1 end
else n:=n+1;
a[m,n]:=-1; end
else begin if n=1 then begin m:=m-1; n:=nrc end
else n:=n-1 end
end;
ReadLn
end.








program Mai_mic_gen;

{$APPTYPE CONSOLE}
Fiind data relatia: (a1,a2,...,an) < (b1,b2,...,bn) <=> (Oricare i:a[i]<= b[i]) si (Exista j:a[j]<b[j]). Sa se genereze elementele c cu proprietatea a<=c<=b.

uses
SysUtils;

type stiva=array[1..30] of integer;
var st,a,b:stiva; ams,ev:boolean; k,n,i:integer;

procedure Init(var st:stiva; k:integer);
begin st[k]:=a[k] end;

procedure Succesor(var st:stiva; k:integer; var ams:boolean);
begin
if st[k]<b[k] then begin st[k]:=st[k]+1; ams:=true end
else ams:=false
end;

procedure Valid(st:stiva; k:integer; var ev:boolean);
begin ev:=true end;

function Maimic(v1,v2:stiva):boolean;
var i:integer; c1,c2:boolean;
begin
c1:=true; c2:=false;
for i:=1 to n do if v1[i]>v2[i] then c1:=false;
for i:=1 to n do if v1[i]<v2[i] then c2:=true;
Maimic:=c1 and c2;
end;

function MaiMicSauEgal(v1,v2:stiva):boolean;
var i:integer; c1:boolean;
begin
c1:=true;
for i:=1 to n do if v1[i]>v2[i] then c1:=false;
MaiMicSauEgal:=c1
end;

procedure Tipar;
var i:integer;
begin
if MaimicSauEgal(st,b) and MaimicSauEgal(a,st) then begin
for i:=1 to n do write(st[i],' ');
writeln
end
end;

begin
Write('N='); ReadLn(n);
Write('Citeste vec a: ');
for i:=1 to n do ReadLn(a[i]);
Write('Citeste vec b: ');
for i:=1 to n do ReadLn(b[i]);
k:=1; st[k]:=0;
while k>0 do begin
repeat
succesor(st,k,ams);
if ams then valid(st,k,ev)
until (not ams) or (ams and ev);
if ams then if k=n then tipar
else begin k:=k+1; st[k]:=0 end
else k:=k-1
end;
ReadLn
end.









program BacktrackingGenMatrice;

{$APPTYPE CONSOLE}
uses
SysUtils;

type matrice=array[1..30,1..30] of integer;
var ams,ev:boolean; m,n,i,nrc,nrl:integer;
a:matrice;

procedure Succesor(var a:matrice; var ams:boolean);
begin
if a[m,n]<1 then begin a[m,n]:=a[m,n]+1; ams:=true end
else ams:=false
end;

procedure Valid(a:matrice; var ev:boolean);
begin
ev:=true;
end;

procedure Tipar;
var i,j:integer;
begin
for i:=1 to nrl do begin
for j:=1 to nrc do write(a[i,j],' ');
writeln
end;
writeln('~~~~~~~~~~~~~~~~~~~~~~~')
end;
begin
Write('Dati nr linii si nr coloane: '); ReadLn(nrl,nrc);
m:=1; n:=1; a[m,n]:=-1;
while (n>0) and (m>0) do begin
repeat
succesor(a,ams);
if ams then valid(a,ev)
until (not ams) or (ams and ev);
if ams then if (m=nrl) and (n=nrc) then tipar
else begin
if n=nrc then begin m:=m+1; n:=1 end
else n:=n+1;
a[m,n]:=-1; end
else begin if n=1 then begin m:=m-1; n:=nrc end
else n:=n-1 end
end;
ReadLn
end.






program cubuletze;

{$APPTYPE CONSOLE}
Fiind data o multime de n cuburi, fiecare cub fiind caracterizat de lungimea laturii si culoarea sa, sa se genereze toate turnurile care se pot forma cu p cuburi astfel incat doua cuburi vecine sa nu aiba aceeasi culoare.

uses
SysUtils;

type stiva=array[1..50] of integer;
cub=record
l:integer; cul:String end;

var st:stiva; ams,ev:boolean; cuburi:array[1..50] of cub;
k,n,i:integer;

procedure Succesor(var st:stiva; k:integer; var ams:boolean);
begin
if st[k]<n then begin st[k]:=st[k]+1; ams:=True end
else ams:=False
end;

procedure Valid(st:stiva; k:integer; var ev:boolean);
var i:integer;
begin
ev:=True;
for i:=1 to k-1 do if st[k]=st[i] then ev:=False;
if k>1 then begin
if cuburi[st[k-1]].cul=cuburi[st[k]].cul then ev:=False;
if cuburi[st[k-1]].l < cuburi[st[k]].l then ev:=False
end
end;

procedure Tipar;
var i:integer;
begin
for i:=1 to n do
write('Cubul ',st[i],' -',cuburi[st[i]].l,' -',cuburi[st[i]].cul,' ');
writeln
end;

begin
ReadLn(n);
for i:=1 to n do begin
Write('Cubul ',i,':'); ReadLn(cuburi[i].l);
ReadLn(cuburi[i].cul) end;
k:=1; st[k]:=0;
while k>0 do begin
repeat
Succesor(st,k,ams);
if ams then Valid(st,k,ev)
until (ams and ev) or (not ams);
if ams then if k=n then Tipar
else begin k:=k+1; st[k]:=0 end
else k:=k-1
end; ReadLn
end.




program produs_cartezian;

type stiva=array[1..50] of integer;
var st,max:stiva; ev,ams:boolean; n,k,i:integer;

procedure Init(var st:stiva; k:integer);
begin
st[k]:=0;
end;

procedure Succesor(var st:stiva; k:integer; var ams:boolean);
begin
if st[k]<max[k] then begin
st[k]:=st[k]+1; ams:=true;
end else ams:=false
end;

procedure Valid(st:stiva; k:integer; var ev:boolean);
var i:integer;
begin
ev:=true
end;

function Solutie:boolean;
begin
Solutie:=(k=n)
end;

procedure Tipar;
var i:integer;
begin
for i:=1 to n do write(st[i],' ');
writeln
end;

begin
writeln('PRODUS CARTEZIAN');
writeln('Dati nr multimilor, apoi elementele lor!');
readln(n);
for i:=1 to n do readln(max[i]);
k:=1; Init(st,k);
while k>0 do begin
repeat
Succesor(st,k,ams);
if ams then Valid(st,k,ev)
until (ams and ev) or (not ams);
if ams then
if Solutie then Tipar
else begin k:=k+1; Init(st,k) end
else k:=k-1
end;
readln;
end.







program paranteze;

type stiva=array[1..100] of integer;
var st:stiva; k,n:integer; ams,ev:boolean;

procedure Init(k:integer; var st:stiva);
begin
st[k]:=-1;
end;

procedure Succesor(var ams:boolean; var st:stiva; k:integer);
begin
if st[k]<1 then begin
st[k]:=st[k]+1;
ams:=true;
end
else ams:=false
end;

procedure Valid(var ev:boolean; st:stiva; k:integer);
begin
ev:=true;
end;

function Solutie(k:integer):boolean;
var i, j:integer; copie:stiva;
begin
for i:=1 to n do copie[i]:=st[i];
for i:=1 to n-1 do
if copie[i]=0 then
for j:=i+1 to n do
if copie[j]=1 then
begin copie[j]:=-1; copie[i]:=-1; break end;
solutie:=true;
for i:=1 to n do
if (copie[i]=1) or (copie[i]=0) then solutie:=false
end;

procedure Tipar;
var i:integer;
begin
for i:=1 to n do
if st[i]=0 then write('(') else write(')');
writeln
end;

begin
write(' PROGRAM PARANTEZE ');
readln;
write('Introduceti N= '); readln(n);
k:=1; Init(k,st);
while (k>0) do begin
repeat
Succesor(ams,st,k);
if ams then Valid(ev,st,k);
until (not ams) or (ams and ev);
if ams then if k=n then if solutie(k) then tipar
else write('*')
else begin k:=k+1; Init(k,st) end
else k:=k-1 end;
readln
end.







program combinari;

type stiva=array[1..50] of integer;
var st:stiva; ev,ams:boolean; n,k,p:integer;

procedure Init(var st:stiva; k:integer);
begin
st[k]:=0;
end;

procedure Succesor(var st:stiva; k:integer; var ams:boolean);
begin
if st[k]<n-p+k then begin
st[k]:=st[k]+1; ams:=true;
end else ams:=false
end;

procedure Valid(st:stiva; k:integer; var ev:boolean);
var i:integer;
begin
ev:=true;
for i:=1 to k-1 do
if (st[i]=st[k]) or (st[i]>st[i+1]) then ev:=false;
end;

function Solutie:boolean;
begin
Solutie:=(k=p)
end;

procedure Tipar;
var i:integer;
begin
for i:=1 to k do write(st[i],' ');
writeln
end;

begin
writeln('Hello!');
readln(n,p);
k:=1; Init(st,k);
while k>0 do begin
repeat
Succesor(st,k,ams);
if ams then Valid(st,k,ev)
until (ams and ev) or (not ams);
if ams then
if Solutie then Tipar
else begin k:=k+1; Init(st,k) end
else k:=k-1
end;
readln;
end.






program partitiile_unui_nr;

type stiva=array[1..50] of integer;
var st:stiva; ev,ams:boolean; n,k:integer;

procedure Init(var st:stiva; k:integer);
begin
st[k]:=0;
end;

procedure Succesor(var st:stiva; k:integer; var ams:boolean);
begin
if st[k]<n-k+1 then begin
st[k]:=st[k]+1; ams:=true;
end else ams:=false
end;

procedure Valid(st:stiva; k:integer; var ev:boolean);
begin
ev:=true;
end;

function Solutie:boolean;
var s,i:integer;
begin
s:=0;
for i:=1 to k do s:=s+st[i];
Solutie:=(s=n)
end;

procedure Tipar;
var i:integer;
begin
for i:=1 to k do write(st[i],' ');
writeln
end;

begin
writeln('Hello!');
readln(n);
k:=1; Init(st,k);
while k>0 do begin
repeat
Succesor(st,k,ams);
if ams then Valid(st,k,ev)
until (ams and ev) or (not ams);
if ams then
if Solutie then Tipar
else begin k:=k+1; Init(st,k) end
else k:=k-1
end;
readln;
end.







program permutari;

type stiva=array[1..50] of integer;
var st:stiva; ev,ams:boolean; n,k:integer;

procedure Init(var st:stiva; k:integer);
begin
st[k]:=0;
end;

procedure Succesor(var st:stiva; k:integer; var ams:boolean);
begin
if st[k]<n then begin
st[k]:=st[k]+1; ams:=true;
end else ams:=false
end;

procedure Valid(st:stiva; k:integer; var ev:boolean);
var i:integer;
begin
ev:=true;
for i:=1 to k-1 do
if st[i]=st[k] then ev:=false;
end;

function Solutie:boolean;
begin
Solutie:=(k=n)
end;

procedure Tipar;
var i:integer;
begin
for i:=1 to n do write(st[i],' ');
writeln
end;

begin
writeln('Hello!');
readln(n);
k:=1; Init(st,k);
while k>0 do begin
repeat
Succesor(st,k,ams);
if ams then Valid(st,k,ev)
until (ams and ev) or (not ams);
if ams then
if Solutie then Tipar
else begin k:=k+1; Init(st,k) end
else k:=k-1
end;
readln;
end.

Das könnte Ihnen auch gefallen