 |
|
 |
|
Geox Administrator DRC


Data inscrierii: 10/Noi/2008 Mesaje: 1898 Localitate: T u l c e a [Drc]
|
|
 |
|
 |
|
Trimis: 21/11/2009 15:17 Titlul subiectului: Ex Info |
|
|
http://cthc.tl.edu.ro/site/
Probleme pascal
program cu_functie;
var a,b:integer;m:real;
function medie(a,b:integer):real;
begin
write('a=');read(a);
write('b=');read(b);
medie:=(a+b)/2;
end;
begin
write(medie(a,b));
readln;readln;
end.
program calcul;
var a1,b1,a2,b2:integer;m1,m2:real;
procedure medie(a,b:integer;var m:real);
begin
m:=(a+b)/2;
write('media:',m:5:2);
end;
begin
write('a1=');read(a1);
write('b1=');read(b1);
medie(a1,b1,m1);
writeln;
write('a2=');read(a2);
write('b2=');read(b2);
medie(a2,b2,m2);
readln;readln;
end.
program calcul;
var m:real; a,b,a0,b0:integer;
procedure medie(a,b:integer);
begin
m:=(a+b)/2;
write('Medie:',m);
end;
begin
medie(2,5);
write('a=');read(a);
write('b=');read(b);
medie(a,b);
a0:=-5;b0:=-4;
medie(a0,b0);
medie(abs(a0),abs(b0));
readln;readln;
end.
Vector
program matrice;
type mat=array [1..10,1..10]of integer;
var a:mat;n,m,i,j,p:integer;
begin
write('n=');read(n);
write('m=');read(m);
p:=1;
for i:=1 to n do
for j:=1 to m do
begin
write('a[',i,',',j,']=');
read(a[i,j]);
end;
for i:=1 to n do
begin
writeln;
for j:=1 to m do
write(a[i,j]:3);
end;
for i:=1 to n do
for j:=1 to m do
p:=p*a[i,j];
writeln;
write('produs=',p);
readln;readln;
end.
program vector;
type mat=array [1..10,1..10]of integer;
var a:mat;n,m,i,j:integer;
begin
write('n=');read(n);
write('m=');read(m);
for i:=1 to n do
for j:=1 to m do
begin
write('a[',i,',',j,']=');
read(a[i,j]);
end;
for i:=1 to n do
for j:=1 to m do
write(a[i,j]);
readln;readln;
end.
program matrice;
type mat=array [1..10,1..10]of integer;
var a:mat;n,m,i,j,p:integer;
begin
write('n=');read(n);
write('m=');read(m);
p:=1;
for i:=1 to n do
for j:=1 to m do
begin
write('a[',i,',',j,']=');
read(a[i,j]);
end;
for i:=1 to n do
begin
writeln;
for j:=1 to m do
write(a[i,j]:3);
end;
for i:=1 to n do
for j:=1 to m do
if (a[i,j]>0)and(a[i,j] mod 2=1) then
p:=p*a[i,j];
writeln;
write('produs nr impare pozitive=',p);
readln;readln;
end.
program matrice;
type mat=array [1..10,1..10]of integer;
var a:mat;n,m,i,j,s:integer;
begin
write('n=');read(n);
write('m=');read(m);
s:=0;
for i:=1 to n do
for j:=1 to m do
begin
write('a[',i,',',j,']=');
read(a[i,j]);
end;
for i:=1 to n do
begin
writeln;
for j:=1 to m do
write(a[i,j]:3);
end;
for i:=1 to n do
for j:=1 to m do
if a[i,j]<0 then
s:=s+a[i,j];
writeln;
write('suma=',s);
readln;readln;
end.
Programe C++
#include<iostream.h>
#include<conio.h>
void main ()
{
int n;
cout<<"nr=";cin >> n;
if (n%2==1)
cout<<"nr este impar";
else
cout<<"nr par";
getch();
}
#include<iostream.h>
#include<conio.h>
void main ()
{
int n;
cout<<"nr=";cin >> n;
if (n%2==0)
cout<<"nr este par";
getch();
}
#include<iostream.h>
#include<conio.h>
void main ()
{
int n;
cout<<"nr=";cin >> n;
if (n>0)
cout<<"nr este pozitiv";
else
cout<<"nr este negativ";
getch();
}
Se citeste un numar n, iar apoi se citesc n numere. Sa se zica daca exista macar un numar care sa aiba exact 3 cifre de 0.
Rezolvare:
#include<iostream.h>
#include<conio.h>
exact3nenule(int numar){
int c_nenule=0;
while(numar > 0){
if((numar % 10)>0)c_nenule = c_nenule + 1;
numar = numar / 10;
}
return c_nenule;}
main(){
int n, numar, i=1;
bool exista = false;
cout<<"Introduceti numarul de valori pe care le veti introduce: ";cin>>n;
while(i<=n){
cout<<"Introduceti un numar: ";cin>>numar;
if(exact3nenule(numar)==3)exista = true;
i=i+1;
}
if(exista == true)cout<<"Exista un numar cu întocmai 3 cifre nenule!";
else cout<<"Nu exista un numar cu exact 3 cifre nenule!";
getch();}
Se citeste un numar. Sa se calculeze suma cifrelor acestuia pana cand ajunge o singura cifra.
Rezolvare:
#include<iostream.h>
#include<conio.h>
suma_cifre(long numar){
int suma=0;
while(numar > 0){
suma = suma + numar % 10;
numar = numar / 10;}
return suma;
}
main(){
long numar;
cout<<"Introduceti un numar natural: ";cin>>numar;
while (numar > 9){
numar = suma_cifre(numar);}
cout<<"Cifra de control este "<<numar;
getch();
}
Se introduce un numar. Sa se afiseze cifra minima si cifra maxima prezente in numar.
Rezolvare:
#include<iostream.h>
#include<conio.h>
main(){
long numar, minim=9, maxim=0, cifra;
cout<<"Introduceti un numar: ";
cin>>numar;
do{
if(numar == 0){
goto end;
}
cifra = numar % 10;
if (cifra > maxim){
maxim = cifra;
}
if(cifra < minim){
minim = cifra;
}
numar = numar / 10;
} while (1);
end:
cout<<"Cifra maxima este "<<maxim<<" iar cea minima este "<<minim;
getch();
}
Se citeste un numar n, si apoi o succesiune de n numere naturale. Sa se afiseze cel mai mare divizor comun al acestora.
Rezolvare:
#include<iostream.h>
#include<conio.h>
cmmdc(int n1, int n2){
int i = n1, cmmdc;
if(n1 > n2)i=n2;
while(i>=1){
if (n1 % i == 0 && n2 % i == 0){
cmmdc = i;
goto end;}
i=i-1;}
end:
return cmmdc;
}
main(){
int n, v_cmmdc, numar, i=2;
cout<<"Introuceti numarul de valori care vor fi citite: ";cin>>n;
cout<<"Introduceti numarul #1 ";cin>>v_cmmdc;
while(i<=n){
i=i+1;
cout<<"Introduceti numarul #"<<(i-1)<<" ";cin>>numar;
v_cmmdc = cmmdc(v_cmmdc, numar);
}
cout<<"Cel mai mare divizor al numerelor introduse este "<<v_cmmdc;
getch();
}
Se introduce un numar. Sa se zica daca este sau nu multiplu de 7.
Rezolvare:
#include<iostream.h>
#include<conio.h>
main(){
int n;
cout<<"Introduceti un numar: ";cin>>n;
if(n%7 == 0){
cout<<"Numarul "<<n<<" este multiplu de 7 !";}
else{
cout<<"Numarul "<<n<<" nu este multiplu de 7 !";}
getch();
}
Se introduc 3 numere reprezentand mărimea celor 3 laturi ale unui triunghi. Sa se zica daca triunghiul este dreptunghic.
Rezolvare:
#include<iostream.h>
#include<conio.h>
main(){
int a,b,c;
cout<<"Introduceti lungimea primei laturi: ";cin>>a;
cout<<"Introduceti lungimea celei de-a doua laturi: ";cin>>b;
cout<<"Introduceti lungimea celei de-a treia laturi: ";cin>>c;
if((a*a + b*b == c*c) || (a*a + c*c == b * b) || (b*b + c*c == a*a)){
goto da;}
else {
goto nu;}
da:
cout<<"Laturile pot forma un triunghi dreptunghic!";
goto end;
nu:
cout<<"Laturile nu pot forma un triunghi dreptunghic!";
end:
getch();
}
Se introduc 2 numere, a si b si un numar k. Sa se spuna daca fractia a/b poate fi simplificat prin k.
Rezolvare:
#include<iostream.h>
#include<conio.h>
main(){
int a,b,k;
cout<<"Introduceti primul numar: ";cin>>a;
cout<<"Introduceti al doilea numar: ";cin>>b;
cout<<"Introduceti numarul cu care doriti sa vedeti daca se simplifica fractia : ";cin>>k;
if(a%k == 0 && b%k==0){
cout<<"Fractia se poate simplifica prin numarul "<<k;}
else{
cout<<"Fractia nu se poate simplifica prin numarul "<<k;}
getch();
}
Se introduce un numar n, iar apoi se citesc n numere de la tastatura. Sa se afiseze valoare minima si cea maxima citita.
Rezolvare:
#include<iostream.h>
#include<conio.h>
max(int numar, int max){
if(numar>max)max=numar;
return max;
}
min(int numar, int min){
if(numar < min)min=numar;
return min;
}
main(){
unsigned int n, numar, maxim=0, minim,i=1;
cout<<"Introduceti numarul de valori ce vor fi citite : ";cin>>n;
while(i<=n){
cout<<"Introduceti un numar: ";cin>>numar;
maxim = max(numar, maxim);
if(i==1)minim=maxim;
minim = min(numar, minim);
i++;}
cout<<"Numarul maxim introdus este "<<maxim<<endl;
cout<<"Numarul minim introdus este "<<minim<<endl;
getch();
}
Se introduce un numar. Sa se afiseze rasturnatul acestuia.
Rezolvare:
#include<iostream.h>
#include<conio.h>
main(){
unsigned long numar, numar2=0;
int cifra;
cout<<"introduceti un numar: ";cin>>numar;
while(numar>0){
cifra = numar % 10;
numar2 = numar2 * 10 + cifra;
numar = numar / 10;}
cout<<numar2;
getch();
}
Se introduce un numar. Sa se afiseze daca e sau nu palindrom (numarul este egal cu rasturnatul lui).
Rezolvare:
#include<iostream.h>
#include<conio.h>
main()
{
long numar, numar_invers, numar_salvat;
cout<<"Introduceti un numar: ";cin>>numar;
numar_salvat = numar;
while(numar>0){
numar_invers = numar_invers * 10 + numar % 10;
numar = numar / 10;}
if(numar_salvat==numar_invers){
cout<<"Numarul este palidrom!";
}
else
cout<<"Numarul nu este palidrom!";
getch();
}
Se introduc o succesiune de valori pana la intalnirea valorii -1. Sa se zica de cate ori a aparut cifra 0 in scrierea numerelor date.
Rezolvare:
#include<iostream.h>
#include<conio.h>
main(){
int numar, v_iesire=0;
while(1){
cout<<"Introduceti un numar: ";cin>>numar;
if(numar==-1)goto end;
if(numar>=0){
while(numar > 0){if(numar%10==0)v_iesire=v_iesire+1;numar=numar/10;}
}}
end:
cout<<"Numarul de zerouri aparute in sirul de numere introdus esre "<<v_iesire;
getch();
}
Se introduc 2 numere. Sa se zica daca aceste numere sunt consecutive.
Rezolvare:
#include<iostream.h>
#include<conio.h>
main(){
int a,b;
cout<<"Introduceti primul numar: ";cin>>a;
cout<<"Introduceti al doilea numar: ";cin>>b;
if(a==b-1 || a==b+1)cout<<"Numerele sunt consecutive!";
else cout<<"Numerele nu sunt consecutive!";
getch();
}
Se introduce un numar n. Sa se afiseze primele n numere piramidale. Prin al n-alea numar piramidal se intelege suma primelor n patrate perfecte.
Rezolvare:
#include<iostream.h>
#include<conio.h>
main(){
int numar, numar_p=0, i=0;
cout<<"Introduceti un numar intreg: ";cin>>numar;
while(i<numar){
i=i+1;
numar_p=numar_p + i*i;
cout<<"Numarul piramidal #"<<i<<": "<<numar_p<<endl;}
getch();
}
Sa se afiseze primele 10 perechi de numere prietene. 2 numere sunt prietene <=> primul e egal cu suma divizorilor celui de-al doilea, si al doilea este egal cu suma divizorilor primului.
Rezolvare:
#include<iostream.h>
#include<conio.h>
suma_div(int numar){
int s_div=0,i=0;
while(i<=numar/2+1){
i=i+1;
if(numar%i==0)s_div=s_div + i;
}
return s_div;
}
main(){
int numar1, numar2, i=1, vmax=0;
while(vmax<10){
numar2 = i;
numar1 = suma_div(numar2);
if(numar2 == suma_div(numar1)){
cout<<"("<<numar1<<","<<numar2<<")"<<endl;
vmax=vmax+1;}
i=i+1;
}
getch();
}
Se citeste un numar n de la tastatura, si apoi n numere intregi. Sa se zica numarul de numere prime citite si daca acesta e numar prim.
Rezolvare:
#include<iostream.h>
#include<conio.h>
eprim(long nr){
long v_ciclare;
bool raspuns = true;
for(v_ciclare=2; v_ciclare<=nr/2+1; v_ciclare++){
if(nr%v_ciclare == 0)raspuns = false;}
return raspuns;
}
main()
{
int n, nr, i, absolut = 0;
cout<<"Introduceti numarul de numere: ";cin>>n;
for(i=1;i<=n;i++)
{
cout<<"Introduceti un numar: ";cin>>nr;
if(eprim(nr)==true)total++;
}
if(eprim(total)==true)cout<<"Numarul de numere prime este "<<total<<" si este un numar prim!";
else cout<<"Numarul de numere prime este "<<total<<" si este un numar prim!";
getch();
}
Se introduce un numar. Sa se afiseze cel mai mare numar prim < decat el si cel mai mic numar prim > decat el.
Rezolvare.
#include<iostream.h>
#include<conio.h>
eprim(long nr){
long v_ciclare;
bool raspuns = true;
for(v_ciclare=2; v_ciclare<=nr/2+1; v_ciclare++){
if(nr%v_ciclare == 0)raspuns = false;}
return raspuns;
}
main(){
long numar, prim=0;
long v_ciclare;
cout<<"Introduceti un numar mai mare decat 2: ";cin>>numar;
v_ciclare=numar;
Se introduce un numar. Sa se afiseze cel mai mare numar prim < decat el si cel mai mic numar prim > decat el
Rezolvare:
#include<iostream.h>
#include<conio.h>
eprim(long nr){
long v_ciclare;
bool raspuns = true;
for(v_ciclare=2; v_ciclare<=nr/2+1; v_ciclare++){
if(nr%v_ciclare == 0)raspuns = false;}
return raspuns;
}
main(){
long numar, prim=0;
long v_ciclare;
cout<<"Introduceti un numar mai mare decat 2: ";cin>>numar;
v_ciclare=numar;
/* Aflam cel mai mare numar prim mai mic decat numarul dat */
while(v_ciclare>2){
v_ciclare = v_ciclare - 1;
if(eprim(v_ciclare)==true){
prim = v_ciclare;
goto end1;}}
end1:
cout<<"Cel mai mare numar prim mai mic decat numarul dat este "<<prim<<endl;
/* Aflam cel mai mic numar prim mai mare decat numarul dat */
while(1){
v_ciclare = v_ciclare + 1;
if(eprim(v_ciclare)==true){
prim = v_ciclare;
goto end2;}}
end2:
cout<<"Cel mai mic numar prim mai mare decat numarul dat este "<<prim<<endl;
getch();
}
Se introduce un numar. Sa se afiseze toate patratele desăvârșite <= decat el.
Rezolvare:
#include<iostream.h>
#include<conio.h>
#include<math.h>
main(){
unsigned long numar, patrat, i=1;
cout<<"introduceti un numar natural: ";cin>>numar;
numar = sqrt(numar);
while(i<=numar){
patrat=i*i;
i=i+1;
cout<<patrat<<endl;}
getch();
}
Se introduc 3 numere, reprezentand lungimea laturilor unui triunghi. Sa se afiseze aria si perimetrul acestuia.
Rezolvare:
#include<iostream.h>
#include<conio.h>
#include<math.h>
main(){
float a,b,c, arie, semip;
cout<<"Introduceti lungimea primei laturi: ";cin>>a;
cout<<"Introduceti lungimea celei de-a doua laturi: ";cin>>b;
cout<<"Introduceti lungimea celei de-a treia laturi: ";cin>>c;
semip = (a+b+c)/2;
arie = sqrt(semip * (semip - a) * (semip - b) * (semip - c));
cout<<"Aria triunghiului este: "<<arie<<" iar perimetrul este "<<semip * 2;
getch();
}
Se introduc 2 numere. Sa se afiseze produsul acestora.
Rezolvare:
#include<iostream.h>
#include<conio.h>
main(){
int a, b;
long produs;
cout<<"Introduceti primul numar: ";cin>>a;
cout<<"Introduceti al doilea numar: ";cin>>b;
produs = a * b;
cout<<"Produsul lor este: "<<produs;
getch();
}
Se introduce un numar. Sa se afiseze numarul de cifre pare, suma acestora, numarul de cifre impare si produsul lor.
Rezolvare:
#include<iostream.h>
#include<conio.h>
main(){
unsigned long numar;
int cifra, suma=0, produs = 1, cifre_pare=0, cifre_impare=0;
cout<<"introduceti un numar: ";cin>>numar;
while(numar>0){
cifra = numar % 10;
if(cifra % 2 == 0){
suma = suma + cifra;
cifre_pare++;
}
else {
produs = produs * cifra;
cifre_impare++;
}
numar = numar / 10;}
cout<<"Suma cifrelor pare este "<<suma<<endl;
cout<<"Produsul cifrelor impare este "<<produs<<endl;
cout<<"Numarul de cifre pare este "<<cifre_pare<<endl;
cout<<"Numarul de cifre impare este "<<cifre_impare<<endl;
getch();
}
Metoda BACKTRACKING
Este o tehnica de programare aplicabila algoritmilor care transmite mai numeroase soluţii şi are ca rezultat obţinerea tuturor soluţiilor problemei. Fiecare soluţie se memorează într-o structura de date de tip stivă implementată cu ajutorul unui vector. Deci fiecare soluţie poate fi pusă sub forma unui vector.
Într-un algoritm backtracking ne interesează toate soluţiile posibile. Pentru a obţine fiecare soluţie finală se întregește stiva indice cu nivel trecând astfel prin nişte soluţii parţiale. Astfel soluţiile finale cât şi cele parţiale pentru a fi luate în considerare trebuie să îndeplinească anumite condiţii numite condiţii de validare. O soluţie care îndeplineşte o astfel de condiţie se numeşte soluţie validă.
Toate configuraţiile stivei ce reprezintă soluţii finale sunt alcătuite din elementele aceleiaşi mulţimi bine definite pe care o numim mulţimea soluţiilor. Fiecare nouă soluţie parţială se obţine prin completarea soluţiei parţiale precedente cu încă o grad pe stivă. La fiecare nivel se pun valori din mulţimea soluţiilor care nu au fost încercate până îndată ce se obţine o soluţie validă. În acest moment se trece la nivelul următor în stivă pentru a completa mai departe soluţia reluând încercările pe noul nivel.
La un moment dat pe un anumit nivel nu mai există nici o valoare neîncercată din mulţimea valorilor problemei. În acest caz se face un pas înapoi în stivă la nivelul anterior şi se reia căutarea cu valorile rămase neîncercate pe acest nivel anterior.
Respectivul nivel a mai fost vizitat dar l-am abandonat după ce am pus o valoare care a generat o soluţie validă. Deci este posibil să fi rămas aici valori neîncercate. Dacă nici pe acest nivel nu mai avem valori neîncercate mai facem un pas înapoi în stivă. Mecanismul revenirilor a determinat denumirea de metoda backtracking.
Plecând de la nivelul 1 şi repetând algoritmul până când pe toate nivelele au fost încercate toate valorile din mulţimea valorilor se obţin soluţii finale care se tipăresc.
Vom implementa metoda backtracking iterativ folosind o rutină unică aplicabilă oricărei probleme. Rutina va apela proceduri şi funcţii care au întotdeauna acelaşi nume şi parametri şi care din punct de vedere al metodei realizează acelaşi lucru.
Sarcina rezolvatorului este să scrie explicit - pentru fiecare problemă – procedurile şi funcţiile aplicate pe rutină. Astfel găsirea următorului element netestat de pe un nivel k al stivei St se face cu procedura succesor (as,St,k)
Odată ales un element testarea condiţiilor de validare se face cu procedura valid (ev,St,k).
Testul dacă s-a ajuns sau nu la o soluţie finală se face cu funcţia soluţie (k)
Soluţia se tipăreşte cu procedura tipar.
De asemenea fiecare nivel al stivei trebuie iniţializat cu o valoare aflată premergător tuturor valorilor posibile din mulţimea soluţiilor. Această afişare se face cu procedura init (k,St).
Rutina Backtracking
K:=1; init (1,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;
Probleme rezolvate
Generarea permutărilor.
program permutări; {iterativ}
type stiva=array [1..10] of integer;
var st:stiva;
ev,as:boolean;
n,k:integer;
procedure init(k:integer;var st:stiva);
begin
st[k]:=0;
end;
procedure succesor(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 valid(var ev:boolean;var st:stiva;k:integer);
var i:integer;
begin
ev:=true;
for i:=1 to k-1 do if st[i]=st[k] then ev:=false;
if (st[k]<0) and (st[k-1]<0) then ev:=false;
end;
function solutie(k:integer):boolean;
begin
solutie:=(k=n);
end;
procedure tipar;
var i:integer;
begin
for i:=1 to n do write (st[i]);
writeln;
end;
begin;
write ('n:=');readln (n);
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;
readln;
end.
Generarea aranjamentelor.
program aranjamente; {iterativ}
type stiva=array [1..10] of integer;
var st:stiva;
ev,as:boolean;
n,k,p:integer;
procedure init(k:integer;var st:stiva);
begin st[k]:=0;
end;
procedure succesor(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 valid(var ev:boolean;var st:stiva;k:integer);
var i:integer;
begin
ev:=true;
for i:=1 to k-1 do if st[i]=st[k] then ev:=false;
if (st[k]<0) and (st[k-1]<0) then ev:=false;
end;
function solutie(k:integer):boolean;
begin
solutie:=(k=p);
end;
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;
readln;
end.
Generarea combinărilor
program combinari;
type stiva=array [1..10] of integer;
var st:stiva;
ev,as:boolean;
n,k,p:integer;
procedure init(k:integer;var st:stiva);
begin
if k>1 then st[k]:=st[k-1]
else if k=1 then st[k]:=0;
end;
procedure succesor(var as:boolean;var st:stiva;k:integer);
begin
if st[k]<n-p+k then begin st[k]:=st[k]+1;
as:=true;
end
else as:=false;
end;
procedure valid(var ev:boolean;var st:stiva;k:integer);
var i:integer;
begin
ev:=true;
for i:=1 to k-1 do if st[i]=st[k] then ev:=false;
if (k=>2) and (st[k-1]>st[k]) then ev:=false;
end;
function solutie(k:integer):boolean;
begin
solutie:=(k=p);
end;
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;
readln;
end.
Dintr-un nr. de 6 cursuri opţionale un elev trebuie să aleagă 3. Să se afişeze toate posibilităţile de alegere precum şi nr. lor.
program cursuri;{iterativ}
const n=6;
p=3;
type stiva=array [1..10] of integer;
var st:stiva;
ev,as:boolean;
k:integer;
procedure init(k:integer;var st:stiva);
begin
if k>1 then st[k]:=st[k-1]
else if k=1 then st[k]:=0;
end;
procedure succesor(var as:boolean;var st:stiva;k:integer);
begin
if st[k]<n-p+k then begin st[k]:=st[k]+1;
as:=true;
end
else as:=false;
end;
procedure valid(var ev:boolean;var st:stiva;k:integer);
var i:integer;
begin
ev:=true;
for i:=1 to k-1 do if st[i]=st[k] then ev:=false;
end;
function solutie(k:integer):boolean;
begin
solutie:=(k=p);
end;
procedure tipar;
var i:integer;
begin
for i:=1 to p do write (st[i]);
writeln;
end;
begin;
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;
readln;
end.
Numerele care îi plac lui Gigel
Lui Gigel îi plac nr. formate numai din cifre pare cifre aflate în ordine descrescătoare. Să se determine şi să se afişeze pe ecran toate nr. de n cifre (0<n<10) care îi plac lui Gigel. Valoarea lui n este un nr. normal care se citeşte de la tastatură.{ex.: n=3 200; 220; 222; 400; 402; 422; 440; 442; 444; 600; 620; 622; 640; 644; 660; 662; 664; 666; 800; 820; 822; 840; 842; 844; 860; 862; 864; 866; 880; 882; 884; 886; 888.}
program nr_lui_gigel; {iterativ}
type stiva=array[1..100] of integer;
var st:stiva;
i,n,k:integer;
as,ev:boolean;
procedure init(k:integer;var st:stiva);
begin
st[k]:=-1;
end;
procedure succesor(var as:boolean;var st:stiva;k:integer);
begin
if st[k]<9 then begin st[k]:=st[k]+1;
as:=true;
end
else as:=false;
end;
procedure valid(var ev:boolean;st:stiva;k:integer);
var i:integer;
begin
ev:=true;
for i:=1 to k-1 do
if st[i] mod 2 <> 0 then ev:=false;
for i:=1 to k-1 do
if st[i]<st[i+1] then ev:=false;
end;
function solutie(k:integer):boolean;
begin
solutie:=(k=n);
end;
procedure tipar;
var i:integer;
begin
for i:=1 to n do write(st[i]);
writeln;
end;
begin
write(‘n= ‘);readln(n);
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;
readln;
end.
La un concurs sportiv s-au înscris n concurenţi având numerele de concurs 1,2,...,n. Pentru fiecare sportiv se cunoaşte tara de origine (şir de caractere). In prima zi vor intra in concurs m concurenţi. Afişaţi toate posibilităţile de a stabili ordinea intrării in concurs a celor m concurenţi respectând următoarele condiţii:
2 sportivi din aceeaşi tara nu pot evolua unul pe urmă altul
trebuie respectata ordinea crescătoare a numerelor de concurs ale sportivilor.
program comcurs_sportiv;{iterativ}
type stiva=array[1..100] of integer;
var st:stiva;
tara:array[1..50] of string;
m,i,n,k:integer;
as,ev:boolean;
procedure init(k:integer;var st:stiva);
begin
st[k]:=0;
end;
procedure succesor(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 valid(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] then ev:=false;
if (k>1) and (tara[st[k-1]]=tara[st[k]]) then ev:=false;
if (k>1) and (st[k]<st[k-1]) then ev:=false;
end;
function solutie(k:integer):boolean;
begin
solutie:=(k=m);
end;
procedure tipar;
var i:integer;
begin
for i:=1 to m do write(st[i],' ');
writeln;
end;
begin
write(‘n= ‘); read(n);
write(‘m= ‘); read(m);
for i :=1 to n do
begin
write(‘concurentul’,i,’=’);readln(ţara[i]);
end;
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;
readln;
end.
Sa se afişeze toate modurile posibile de a descompune un număr natural n in suma de k numere naturale diferite(n si k sunt cunoscute).
program desc;
type stiva=array[1..100] of integer;
var st:stiva;
s,n,k,p:integer;
as,ev:boolean;
procedure init(k:integer;var st:stiva);
begin
st[k]:=0;
end;
procedure succesor(var as:boolean;var st:stiva;k:integer);
begin
if st[k]<n-p+k then begin
st[k]:=st[k]+1;
as:=true;
end
else as:=false;
end;
procedure valid(var ev:boolean;st:stiva;k:integer);
var i:integer;
begin
s:=0;
ev:=true;
for i:=1 to k-1 do if st[k]=st[i] then ev:=false;
if (k>=2) and (st[k]<st[k-1]) then ev:=false;
for i:=1 to k do s:=s+st[i];
if s>n then ev:=false;
end;
function solutie(k:integer):boolean;
begin
solutie:=(k=p);
end;
procedure tipar;
var i:integer;
begin
if s=n then
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;
readln;
end.
La un festival de muzica s-au înscris n melodii codificate 1,2,3,...,n (n>=4). Sa se afişeze toate posibilităţile de a stabili ordinea intrării in concurs a melodiilor ştiind ca melodiile cu codurile C1 si C2 trebuie obligatoriu sa evolueze a doua respectiv penultima. Valorile lui C1 si C2 se citesc de la tastatura C1,C2 aparţin {1,2,...,n}.
program festival;
type stiva=array[1..100] of integer;
var st:stiva;
k,n,C1,C2:integer;
as,ev:boolean;
procedure init(k:integer;var st:stiva);
begin
st[k]:=0;
end;
procedure succesor(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 valid(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] then ev:=false;
if (k=2) and (st[k]<>C1) then ev:=false;
if (k=n-1) and (st[k]<>C2) then ev:=false;
end;
function solutie(k:integer):boolean;
begin
solutie:=(k=n);
end;
procedure tipar;
var i:integer;
begin
for i:=1 to n do write(st[i]);
writeln;
end;
begin
write('n=');readln(n);
write('melodia a II-a este: ');readln(C1);
write('penultima melodie este: ');readln(C2);
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;
readln;
end.
Se da un număr natural par. Sa se afişeze toate şirurile de n paranteze care se închid corect.
program paranteze;
type stiva=array[1..100] of integer;
var st:stiva;
npd,npi,n,k:integer;
as,ev:boolean;
procedure init(k:integer;var st:stiva);
begin
st[k]:=0;
end;
procedure succesor(var as:boolean;var st:stiva;k:integer);
begin
if st[k]<2 then
begin
st[k]:=st[k]+1;
as:=true;
end
else as:=false;
end;
procedure valid(var ev:boolean;st:stiva;k:integer);
var i:integer;
begin
npd:=0;
npi:=0;
for i:=1 to k do
if st[i]=1 then npd:=npd+1
else npi:=npi+1;
if (npd>=npi) and (npd<=n div 2) then ev:=true
else ev:=false;
end;
function solutie(k:integer):boolean;
begin
solutie:=(k=n);
end;
procedure tipar;
var i:integer;
begin
if npd=npi then
for I:=1 to k do
if st[i]=1 then write(‘(‘)
else write(‘)’);
writeln;
begin
write(‘n= ‘);read(n);
st[1]=1;
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;
readln;
end.
Problema celor n dame.
Fiind dată o tablă de şah n x n se cer toate soluţiile de aranjare a n dame astfel încât să nu se afle 2 dame pe aceeaşi linie, coloană sau diagonală.
program dame;{iterativ}
type stiva=array[1..100] of integer;
var st:stiva;
n,k:integer;
as,ev:boolean;
procedure init(k:integer;var st:stiva);
begin
st[k]:=0;
end;
procedure succesor(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 valid(var ev:boolean;var 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 solutie(k:integer):boolean;
begin
solutie:=(k=n);
end;
procedure tipar;
var i:integer;
begin
for i:=1 to n do write(st[i]);
writeln;
end;
begin
write('n:');readln(n);
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;
readln;
end.
Se citesc n numere naturale si n mulţimi A1,A2,...,An. Sa se calculeze materialul finit cartezian al mulţimilor date.
program pcartez;
type stiva=array[1..100] of integer;
var st:stiva;
i,n,k:integer;
as,ev:boolean;
a:array [1..100] of integer;
procedure init(k:integer;var st:stiva);
begin
st[k]:=0;
end;
procedure succesor(var as:boolean;var st:stiva;k:integer);
begin
if st[k]<a[k] then begin
st[k]:=st[k]+1;
as:=true;
end
else as:=false;
end;
procedure valid(var ev:boolean;st:stiva;k:integer);
var i:integer;
begin
ev:=true;
end;
function solutie(k:integer):boolean;
begin
solutie:=(k=n);
end;
procedure tipar;
var i:integer;
begin
for i:=1 to n do write(st[i]);
writeln;
end;
begin
write('Numarul de multimi= ');readln(n);
for i:=1 to n do begin
write('a[',i,']=');readln(a[i]);
end;
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.
Se citeşte un număr natural n. Se cere sa se tipărească toate modurile de descompunere a lui n ca suma de numere naturale.
program desc2;
type stiva=array[1..100] of integer;
var st:stiva;
s,n,k:integer;
as,ev:boolean;
procedure init(k:integer;var st:stiva);
begin
st[k]:=0;
end;
procedure succesor(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 valid(var ev:boolean;st:stiva;k:integer);
var i:integer;
begin
s:=0;
ev:=true;
for i:=1 to k do s:=s+st[i];
if s<=n then ev:=true
else ev:=false;
end;
function solutie(k:integer):boolean;
begin
solutie:=(s=n);
end;
procedure tipar;
var i:integer;
begin
for i:=1 to k do write(st[i]);
writeln;
end;
begin
write('n=');readln(n);
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.
Problema Comis-voiajor
Un comis-voiajor trebuie sa viziteze un numar n de orase. Iniţial, acesta se afla intr-unul dintre ele, notat 1. Comis-voiajorul doreşte sa nu treacă de doua ori prin acelaşi oraş, iar la întoarcere sa revină in oraşul 1. Cunoscând legaturile existente intre orase, se cere sa se tipărească toate drumurile posibile pe care le poate efectua comis-voiajorul.
program comisv;
type stiva=array[1..100] of integer;
var st:stiva;
i,j,n,k:integer;
as,ev:boolean;
a:array[1..20,1..20] of integer;
procedure init(k:integer;var st:stiva);
begin
st[k]:=1;
end;
procedure succesor(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 valid(var ev:boolean;st:stiva;k:integer);
var i:integer;
begin
ev:=true;
if a[st[k-1],st[k]]=0 then ev:=false
else
for i:=1 to k-1 do if st[i]=st[k] then ev:=false;
if (k=n) and (a[1,st[k]]=0) then ev:=false
end;
function solutie(k:integer):boolean;
begin
solutie:=(k=n)
end;
procedure tipar;
var i:integer;
begin
for i:=1 to n do
write(‘nodul=’,st[i]);
writeln(‘------‘);
end;
begin
write(‘nr. de noduri=’);readln(n);
for i:= 1 to n do
for j:=1 to i-1 do begin
write(‘a[‘,i,’,’,j,’]=’); readln(a[i,j]);
a[j,i]:=a[j,i];
end;
end;
st[1]:=1; k:=2;
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.
Scrieţi un program care, folosind metoda backtracking, afişează toate modurile de a aranja elementele unui şir dat de numere întregi astfel încât in şirul rezultat sa nu existe doua elemente negative alăturate.
program sir;
type stiva=array[1..100] of integer;
vector=array[1..100] of integer;
var st:stiva;
n,k,i:integer;
as,ev:boolean;
a:vector;
procedure init(k:integer;var st:stiva);
begin
st[k]:=0;end;
procedure succesor(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 valid(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] then ev:=false;
if (a[st[k]]<0) and (a[st[k-1]]<0) then ev:=false;
end;
function solutie(k:integer):boolean;
begin
solutie:=(k=n);
end;
procedure tipar;
var i:integer;
begin
for i:=1 to n do write(a[st[i]],' ');
writeln;
end;
begin
write('n=');readln(n);
for i:=1 to n do
begin
write(‘a[‘,i,’]=’);readln(a[i]);
end;
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.
Turnuri de cuburi
Se dau n cuburi numerotate 1,2,...,n, de laturi Li si culori Ci, i=1,2,...,n (fiecare culoare este codificata printr-un caracter). Sa se afişeze toate turnurile care se pot forma luând k cuburi din cele n disponibile, astfel încât:
-laturile cuburilor din turn sa fie in ordine crescătoare;
-culorile a oricare doua cuburi alăturate din turn sa fie diferite.
program cuburi;
type stiva=array [1..100] of integer;
var st:stiva;
i,n,p,k:integer;
as,ev:boolean;
L:array [1..10] of integer;
C:array [1..10] of char;
procedure init(k:integer;var st:stiva);
begin
st[k]:=0;
end;
procedure succesor(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 valid(var ev:boolean;st:stiva;k:integer);
var i:integer;
begin
ev:=true;
for i:=1 to k-1 do if L[st[k]]<=L[st[i]] then ev:=false;
if C[st[k]]=C[st[k-1]] then ev:=false;
end;
function solutie(k:integer):boolean;
begin
solutie:=(k=p);
end;
procedure tipar;
var i:integer;
begin
for i:=1 to p do write(st[i],’ ‘);
writeln;
end;
begin
write(‘n= ‘);read(n);
write(‘p= ‘);read(p);
for i:=1 to n do
begin
write(‘L[‘,i,’]=’);readln(L[i]);
write(‘C[‘,i,’]=’);readln(C[i]);
end;
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.
Generarea partiţiilor unui nr.
Se citeşte un nr. natural n .Se cere să sa tipărească toate modurile de descompunere a lui n ca sumă de nr. naturale.
program partiţii_ale_unui_nr;
type stiva=array [1..10] of integer;
var st:stiva;
ev,as:boolean;
n,k:integer;
procedure init(k:integer;var st:stiva);
begin st[k]:=0;
end;
procedure succesor(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 valid(var ev:boolean;var st:stiva;k:integer);
var i,s:integer;
begin s:=0;
for i:=1 to k do
s:=s+st[i];
if s<=n then ev:=true
else ev:=false;
end;
function solutie(k:integer):boolean;
begin
solutie:=(k=n);
end;
procedure tipar;
var i:integer;
begin
for i:=1 to n do write (st[i]);
writeln;
end;
begin;
write ('n:=');readln (n);
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;
readln;
end.
Drapele
program drapele;
const n=7;
type stiva=array [1..10] of integer;
var st:stiva;
ev,as:boolean;
n,k:integer;
procedure init(k:integer;var st:stiva);
begin st[k]:=0;
end;
procedure succesor(var as:boolean;var st:stiva;k:integer);
begin
if st[k]<7 then begin st[k]:=st[k]+1;
as:=true;
end
else as:=false;
end;
procedure valid(var ev:boolean;var st:stiva;k:integer);
var i:integer;
begin
ev:=true;
for i:=1 to k-1 do if st[i]=st[k] then ev:=false;
if (st[3]=1) or (st[3]=3) or (st[3]=2) then ev:=false;
if st[3]=(1,2,3) then ev:=false;
for i:=1 to 4 do if st[2]<>st[i] then ev:=false;
end;
function solutie(k:integer):boolean;
begin
solutie:=(k=n);
end;
procedure tipar;
var i:integer;
begin
for i:=1 to n do write (st[i]);
writeln;
end;
begin;
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;
readln;
end.
Backtracking recursiv(după schemă)
Generarea permutărilor.
program permutări;
type stiva=array [1..10] of integer;
var st:stiva;
ev:boolean;
n,k:integer;
procedure init(k:integer;var st:stiva);
begin st[k]:=0;
end;
function succesor(var st:stiva;k:integer);
begin
if st[k]<n then begin
st[k]:=st[k]+1;
succesor:=true;
end
else succesor:=false;
end;
procedure valid(var ev:boolean;var st:stiva;k:integer);
var i:integer;
begin
ev:=true;
for i:=1 to k-1 do
if st[i]=st[k] then ev:=false;
if (st[k]<0) and (st[k-1]<0) then ev:=false;
end;
procedure tipar;
var i:integer;
begin
for i:=1 to n do write (st[i]);
writeln; end;
procedure back(k:integer)
begin
if k=n then tipar
else begin
init(k,st);
while succesor(st,k) do
begin
valid(ev,st,k);
if ev then back(k+1);
end;
end;
end;
begin
write(‘n= ‘);read(n);
back(1);readln;
end.
Generarea aranjamentelor.
program aranjamente;
type stiva=array [1..10] of integer;
var st:stiva;
ev:boolean;
n,k:integer;
procedure init(k:integer;var st:stiva);
begin st[k]:=0;
end;
function succesor(var st:stiva;k:integer);
begin
if st[k]<n then begin
st[k]:=st[k]+1;
succesor:=true;
end
else succesor:=false;
end;
procedure valid(var ev:boolean;var st:stiva;k:integer);
var i:integer;
begin
ev:=true;
for i:=1 to k-1 do
if st[i]=st[k] then ev:=false;
if (st[k]<0) and (st[k-1]<0) then ev:=false
end;
procedure tipar;
var i:integer;
begin
for i:=1 to p do write (st[i]);
writeln;
end;
procedure back(k:integer)
begin
if k=p then tipar
else begin
init(k,st);
while succesor(st,k) do
begin
valid(ev,st,k);
if ev then back(k+1);
end;
end;
end;
begin
write(‘n= ‘);read(n);
write(‘p= ‘);read(p);
back(1);readln;
end.
Generarea combinărilor.
program combinărilor;
type stiva=array [1..10] of integer;
var st:stiva;
ev:boolean;
n,k:integer;
procedure init(k:integer;var st:stiva);
begin st[k]:=0;
end;
function succesor(var st:stiva;k:integer);
begin
if st[k]<n-p+k then begin
st[k]:=st[k]+1;
succesor:=true;
end
else succesor:=false;
end;
procedure valid(var ev:boolean;var st:stiva;k:integer);
var i:integer;
begin
ev:=true;
for i:=1 to k-1 do
if st[i]=st[k] then ev:=false;
if (k=>2) and (st[k-1]>st[k]) then ev:=false;
end;
procedure tipar;
var i:integer;
begin
for i:=1 to p do write (st[i]);
writeln; end;
procedure back(k:integer)
begin
if k=p then tipar
else begin
init(k,st);
while succesor(st,k) do
begin
valid(ev,st,k);
if ev then back(k+1);
end;
end;
end;
begin
write(‘n= ‘);read(n);
write(‘p= ‘);read(p);
back(1);readln;
end.
Backtracking recursiv(fără schemă)
Generarea permutărilor.
program permutări;
type stiva=array [1..10] of integer;
var st:stiva;
n,k:integer;
procedure init(k:integer;var st:stiva);
begin st[k]:=0;
end;
function valid(k:integer):boolean;
var i:integer;
ok:boolean;
begin
ok=true;
for i:=1 to k-1 do
if st[i]=st[k] then ok=false;
{if (st[k]<0) and (st[k-1]<0) then ok=false;}
valid:=ok
end;
procedure tipar;
var i:integer;
begin
for i:=1 to n do write (st[i]);
writeln;
end;
procedure back(k:integer)
var val:integer;
begin
for val :=1 to n do
begin
st[k]:=val;
if valid(k) then
if k=n then tipar
else back(k+1);
end;
begin
write(‘n= ‘);read(n);
init(k);
back(1);
end.
Generarea aranjamentelor.
program aranjamente;
type stiva=array [1..10] of integer;
var st:stiva;
n,k:integer;
procedure init(k:integer;);
begin st[k]:=0;
end;
function valid(k:integer):boolean;
var i:integer;
ok:boolean;
begin
ok=true;
for i:=1 to k-1 do
if st[i]=st[k] then ok:=false;
if (st[k]<0) and (st[k-1]<0) then ok:=false;
valid:=ok;
end;
procedure tipar;
var i:integer;
begin
for i:=1 to p do write (st[i]);
writeln;
end;
procedure back(k:integer)
var val:integer;
begin
for val :=1 to n do
begin
st[k]:=val;
if valid(k) then
if k=p then tipar
else back(k+1);
end;
begin
write(‘n= ‘);read(n);
write(‘p= ‘);read(p);
init(k);
back(1);
end.
Generarea combinărilor.
program combinărilor;
type stiva=array [1..10] of integer;
var st:stiva;
n,k:integer;
procedure init(k:integer);
begin st[k]:=0;
end;
function valid(k:integer):boolean;
var i:integer;
ok:boolean;
begin
ok:=true;
for i:=1 to k-1 do
if st[i]=st[k] then ok:=false;
if (k=>2) and (st[k-1]>st[k]) then ok:=false;
valid:=ok;
end;
procedure tipar;
var i:integer;
begin
for i:=1 to p do write (st[i]);
writeln;
end;
procedure back(k:integer)
var val:integer;
begin
for val :=1 to n-p+k do
begin
st[k]:=val;
if valid(k) then
if k=p then tipar
else back(k+1);
end;
begin
write(‘n= ‘);read(n);
write(‘p= ‘);read(p);
init(k);
back(1);
end. |
|