Sunteți pe pagina 1din 26

LICEUL TEORETIC MIHAIL KOGLNICEANU

VASLUI

LUCRARE PENTRU OBINEREA


ATESTATULUI PROFESIONAL
- PROFIL MATEMATIC-INFORMATIC -

Profesor ndrumtor,
Nicu Vlad Laureniu
Candidat,
Croitoru Nicolae Radu
2017

2
Algoritmi de combinatorica

3
MEMORIU JUSTIFICATIV

Mi-am ales aceasta tema, deoarece am studiat tehnica backtracking la matematica si


informatica. Am fost pasionat de combinatorica inca din clasa a 9-a cand abia am descoperit
tainele informaticii. La matematica in clasa a 10-a am studiat aranjamente si combinari si mi
s-au parut interesante la vremea aceea. De aceea mi-am ales aceasta tema pe care am abordat-
o in limbajul C++ pe un numar de 10 probleme.

4
PREZENTARE PROGRAM/
MEDIU DE PROGRAMARE

Backtracking este numele unui algoritm general de descoperire a tuturor soluiilor unei
probleme de calcul, algoritm ce se bazeaz pe construirea incremental de soluii-candidat,
abandonnd fiecare candidat parial imediat ce devine clar c acesta nu are anse s devin o
soluie valid.

Exemplul de baz folosit n numeroase manuale de liceu i de nivel universitar este problema
reginelor, care cere s se gseasc toate modurile n care pot fi aezate pe o tabl de ah opt
regine astfel nct s nu se atace. n abordarea backtracking, candidatele pariale sunt
aranjamente de cte k regine pe primele k rnduri ale tablei, toate pe rnduri i coloane
diferite. Orice soluie parial ce conine dou regine care se atac poate fi abandonat,
deoarece n mod clar restul de regine nu pot fi aezate ntr-o soluie valid.

Tehnica backtracking se poate aplica doar pentru probleme ce admit conceptul de candidat
parial de soluie i ofer un test relativ rapid asupra posibilitii ca un astfel de candidat s
fie completat ctre o soluie valid. Cnd se poate aplica, ns, backtrackingul este adesea
mult mai rapid dect cutarea prin metoda forei brute prin toi candidaii, ntruct este
capabil s elimine dintr-un singur test un mare numr de candidai.

Backtrackingul este util la rezolvarea unor probleme de satisfacere a constrngerilor, cum ar fi


cuvintele ncruciate, jocuri de sudoku i alte probleme similare. Ea st la baza unei serii de
limbaje de programare logic, cum ar fi Icon, Planner i Prolog.

Termenul backtrack a fost inventat de matematicianul american D. H. Lehmer n anii 1950.

Combinatorica este ramura matematicii care se ocup cu studiul mulimilor (de obicei finite)
de obiecte i modalitile de a le "combina". Aceasta este nrudit cu alte domenii ale
matematicii, n special cu algebra, geometria i teoria probabilitilor, avnd aplicabilitate i
n domenii precum informatica i fizica statistic. n particular, sunt studiate probleme de
numrare (combinatoric enumerativ), de generare i de analiz (design combinatoric i
teoria matroizilor), de determinare a "celui mai mare", "celui mai mic" sau a "celui mai bun"
obiect al mulimii (combinatoric extremal i optimizare combinatoric), sau cu
determinarea structurilor algebrice ale acelor obiecte (combinatoric algebric).

Combinatorica vizeaz att rezolvarea de probleme ct i construciile teoretice, fiind


dezvoltate metode teoretice puternice, ncepnd cu sfritul secolului XX. Una din cele mai
vechi i accesibile pri ale combinatoricii este teoria grafurilor, aceasta, la rndul ei, avnd
conexiuni cu multe alte domenii. Combinatorica este folosit frecvent n informatic pentru a
estima numrul de elemente ale anumitor mulimi.

5
DESCRIEREA APLICATIEI

Descrierea metodei backtracking


void init () //aceasta functie initializeaza nivelul k al stivei cu 0
{
st[k]=0;
}

int succesor() //pe nivelul k exista succesor daca st[k]<n


{
if (st[k]<n)
{
{st[k]=st[k]+1; return 1;}
}
else return 0;
}
int valid () //se verifica daca pe nivelul k am pus o valoare diferita de cele de pe nivelele
inferioare
{
for(int i=1;i<k;i++)
if(st[k]==st[i]) return 0;
return 1;
}
int solutie () //obtinem o solutie atunci cand stiva a fost completata; adica k=n
{
return k==n;
}
void tipar() //aceasta functie are roulu de a tipari solutia (afiseaza continutul stivei)
{
for(int i=1;i<=n;i++)
cout<<st[i]<<" ";
cout<<"\n";
}
void bt ()
{
k=1; //se porneste algoritmul cu primul nivel al stivei
init (); //initializeaza cu 0 nivelul k
while(k>0) //cat timp stiva este nevida, algoritmul se incheie
cand nu mai putem elemente in stiva, deci cand k=0
{
as=1;ev=0; //initializari
while(as && !ev) //cat timp are successor nevalid, caut un successor valid
{
as=succesor();
if(as) ev=valid();
}
if(as) //daca are successor valid, verific daca avem solutii
if(solutie()) tipar();
else {k++; init();} //daca nu avem solutii este echivalent cu k<n, deci stiva nu este
completa si trebuie urcat pe nivelul superior
else k--; //nu avem successor valid, deci trebuie coborat pe un nivel inferior
}
}

6
1.Permutari

Cerina
Se citete un numr natural nenul n. S se afieze, n ordine lexicografic,
permutrile mulimii {1,2,..,n}.

Restricii i precizri
0 < n < 9

Exemplu
-date de intrare: 3
-date de iesire:

123

132

213

231

312
321

Codul sursa
#include <iostream>
using namespace std;
typedef int stiva[10];
int n, k, ev, as;
stiva st;

void init ()
{
st[k]=0;
}

int succesor()
{
if (st[k]<n)
{
{st[k]=st[k]+1; return 1;}
}
else return 0;
}
int valid ()
{
for(int i=1;i<k;i++)

7
if(st[k]==st[i]) return 0;
return 1;
}
int solutie ()
{
return k==n;
}
void tipar()
{
for(int i=1;i<=n;i++)
cout<<st[i]<<" ";
cout<<"\n";
}
void bt ()
{
k=1;
init ();
while(k>0)
{
as=1;ev=0;
while(as && !ev)
{
as=succesor();
if(as) ev=valid();
}
if(as)
if(solutie()) tipar();
else {k++; init();}
else k--;
}
}

int main ()
{
cin>>n;
bt();
return 0;
}

2.Permutari1

Cerina
Se citete un numr natural nenul n. S se afieze, n ordine invers lexicografic,
permutrile mulimii {1,2,..,n}.

Restricii i precizri
0 < n < 9

Exemplu
-date de intrare: 3
-date de iesire:

321

312
8
231

213

132

123

Codul sursa
#include <iostream>
using namespace std;
typedef int stiva[10];
int n, k, ev, as;
stiva st;
void init ()
{
st[k]=n+1;
}

int succesor()
{
if (st[k]>1)
{
{st[k]=st[k]-1; return 1;}
}
else return 0;
}
int valid ()
{
for(int i=1;i<k;i++)
if(st[k]==st[i]) return 0;
return 1;
}
int solutie ()
{
return k==n;
}
void tipar()
{
for(int i=1;i<=n;i++)
cout<<st[i]<<" ";
cout<<"\n";
}
void bt ()
{
k=1;
init ();
while(k>0)
{
as=1;ev=0;
while(as && !ev)
{
as=succesor();
if(as) ev=valid();
}
if(as)
if(solutie()) tipar();
else {k++; init();}

9
else k--;
}
}

int main ()
{
cin>>n;
bt();
return 0;
}

3.Permutari2

Cerina
Se citete un numr natural nenul n, apoi n numere naturale distincte. S se
afieze, n ordine lexicografic, permutrile mulimii formate din cele n numere
citite.

Restricii i precizri
0 < n < 9

Exemplu
-date de intrare:
3
473
-date de iesire:

347

374

437

473

734

743
Codul sursa

#include <iostream>
using namespace std;
typedef int stiva[10];
int a[10] ,n, k, ev, as;
stiva st;
void init ()
{
10
st[k]=0;
}

int succesor()
{
if (st[k]<n)
{
{st[k]=st[k]+1; return 1;}
}
else return 0;
}
int valid ()
{
for(int i=1;i<k;i++)
if(st[k]==st[i]) return 0;
return 1;
}
int solutie ()
{
return k==n;
}
void tipar()
{
for(int i=1;i<=n;i++)
cout<<a[st[i]]<<" ";
cout<<"\n";
}
void bt ()
{
k=1;
init ();
while(k>0)
{
as=1;ev=0;
while(as && !ev)
{
as=succesor();
if(as) ev=valid();
}
if(as)
if(solutie()) tipar();
else {k++; init();}
else k--;
}
}

int main ()
{
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i];
for(int i=1;i<n;i++)
for(int j=i+1;j<=n;j++)
if(a[i]>a[j]){int aux=a[i]; a[i]=a[j]; a[j]=aux;}
bt();
return 0;
}

11
4.SirPIE

Cerina
Se citete un numr natural nenul n, apoi n numere naturale distincte. S se
afieze, n ordine lexicografic, irurile din cele n valori cu proprietatea c oricare
dou valori nvecinate sunt prime ntre ele.

Restricii i precizri
1 n 20

cele n numere de pe a doua linie a fiierului de intrare sunt mai mici


dect 10000

Exemplu
-date de intrare:
4
8679
-date de iesire:

6789

6798

8976

9876
Codul sursa

#include <iostream>
using namespace std;
typedef int stiva[21];
int a[21] ,n, k, ev, as;
stiva st;
int cmmdc(int x, int y)
{
while(x!=y)
{
if(x>y) x=x-y;
else
y=y-x;
}
return x;
}
void init ()

12
{
st[k]=0;
}

int succesor()
{
if (st[k]<n)
{
{st[k]=st[k]+1; return 1;}
}
else return 0;
}
int valid ()
{
for(int i=1;i<k;i++)
if(st[k]==st[i]) return 0;
if((k>1)&&(cmmdc(a[st[k]],a[st[k-1]])!=1)) return 0;
return 1;
}
int solutie ()
{
return k==n;
}
void tipar()
{
for(int i=1;i<=n;i++)
cout<<a[st[i]]<<" ";
cout<<"\n";
}
void bt ()
{
k=1;
init ();
while(k>0)
{
as=1;ev=0;
while(as && !ev)
{
as=succesor();
if(as) ev=valid();
}
if(as)
if(solutie()) tipar();
else {k++; init();}
else k--;
}
}
int main ()
{
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i];
for(int i=1;i<n;i++)
for(int j=i+1;j<=n;j++)
if(a[i]>a[j]){int aux=a[i]; a[i]=a[j]; a[j]=aux;}
bt();
return 0;
}

13
5.Regine1

Cerina
Se consider o tabl de ah de dimensiune n. S se plaseze pe tabl n regine
astfel nct s nu existe dou regine care s se atace. Programul citete de la
tastatur numrul n. Programul va afia pe ecran o singur configuraie valid a
tablei de ah. Ea va fi alctuit din n linii cu cte n caractere - sau *, separate
prin cte un spaiu. Caracterul - reprezint o poziie liber de pe tabl, iar
caracterul * reprezint o poziie de pe tabl ocupat de o regin.

Restricii i precizri

4 n 10;

dou regine se atac dac se afl pe aceeai linie, aceeai coloan sau
aceeai diagonal;

orice configuraie valid a tablei este acceptat.

Exemplu
-date de intrare: 4
-date de iesire:

--*-

*---

---*

-*--
Codul sursa
#include <iostream>
#include <stdlib.h>
using namespace std;
typedef int stiva[16];
int n, k, ev, as;
stiva st;
void init ()
{
st[k]=0;
}

int succesor()
{
if (st[k]<n)
{
{st[k]=st[k]+1; return 1;}

14
}
else return 0;
}
int valid ()
{
for(int i=1;i<k;i++)
if((st[k]==st[i]) || (abs(k-i)==abs(st[k]-st[i]))) return 0;
return 1;
}
int solutie ()
{
return k==n;
}
void tipar()
{
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{if (st[i]==j) cout<<"* ";
else
cout<<"- ";

} cout<<"\n";
}
k=-1;
}
void bt ()
{
k=1;
init ();
while(k>0)
{
as=1;ev=0;
while(as && !ev)
{
as=succesor();
if(as) ev=valid();
}
if(as)
if(solutie()) tipar();
else {k++; init();}
else k--;
}
}

int main ()
{
cin>>n;
bt();
return 0;
}

6.PermPF

15
Cerina
Fie mulimea M={1,2,..,n} i P(1),P(2),...,P(n) o permutare a ei.
Elementul x din M se numete punct fix dac P(x)=x. Se citete un numr
natural nenul n. S se afieze, n ordine lexicografic, permutrile fr puncte fixe
ale mulimii {1,2,..,n}.

Restricii i precizri
0 < n < 9

Exemplu
-date de intrare: 3
-date de iesire:
231
312
Codul sursa
#include <iostream>
using namespace std;
typedef int stiva[11];
int n, k, ev, as;
stiva st;
void init ()
{
st[k]=0;
}

int succesor()
{
if (st[k]<n)
{
{st[k]=st[k]+1; return 1;}
}
else return 0;
}
int valid ()
{
if(st[k]==k) return 0;
for(int i=1;i<k;i++)
if(st[k]==st[i]) return 0;
return 1;
}
int solutie ()
{
return k==n;
}
void tipar()
{
for(int i=1;i<=n;i++)
cout<<st[i]<<" ";
cout<<"\n";
}
16
void bt ()
{
k=1;
init ();
while(k>0)
{
as=1;ev=0;
while(as && !ev)
{
as=succesor();
if(as) ev=valid();
}
if(as)
if(solutie()) tipar();
else {k++; init();}
else k--;
}
}

int main ()
{
cin>>n;
bt();
return 0;
}

7.Aranjamente

Cerina
Se citesc dou numere naturale nenule n i k. S se afieze, n ordine

lexicografic, aranjamentele de cte k elemente ale mulimii {1,2,..,n}.

Restricii i precizri
0 < k < n < 9

Exemplu
-date de intrare: 4 2
-date de iesire:
12
13
14
21
23
24
31
32
34
17
41
42
43

Codul sursa

#include <iostream>
using namespace std;
typedef int stiva[16];
int n, p, k, ev, as;
stiva st;
void init ()
{
st[k]=0;
}
int succesor()
{
if (st[k]<n)
{
{st[k]=st[k]+1; return 1;}
}
else return 0;
}
int valid ()
{
for(int i=1;i<k;i++)
if (st[k]==st[i]) return 0;
return 1;
}
int solutie ()
{
return k==p;
}
void tipar()
{
for(int i=1;i<=p;i++)
cout<<st[i]<<" ";
cout<<"\n";
}
void bt ()
{
k=1;
init ();
while(k>0)
{
as=1;ev=0;
while(as && !ev)
{
as=succesor();
if(as) ev=valid();
}
if(as)
if(solutie()) tipar();
else {k++; init();}
else k--;
}
}

int main ()
{
cin>>n>>p;
bt();
18
return 0;
}

8.Combinari

Cerina
Se citesc dou numere naturale nenule n i k. S se afieze, n ordine
lexicografic, submulimile de cte k elemente ale mulimii {1,2,..,n}.

Restricii i precizri
1 k n 15

elementele fiecrei submulimi vor fi afiate n ordine cresctoare

Exemplu
-date de intrare: 4 2
-date de iesire:

12

13

14

23

24

34
Codul sursa

#include <iostream>
using namespace std;
typedef int stiva[16];
int n, p, k, ev, as;
stiva st;
void init ()
{
st[k]=0;

19
}
int succesor()
{
if (st[k]<n)
{
{st[k]=st[k]+1; return 1;}
}
else return 0;
}
int valid ()
{
if ((k>1) && (st[k]<=st[k-1])) return 0;
return 1;
}
int solutie ()
{
return k==p;
}
void tipar()
{
for(int i=1;i<=p;i++)
cout<<st[i]<<" ";
cout<<"\n";
}
void bt ()
{
k=1;
init ();
while(k>0)
{
as=1;ev=0;
while(as && !ev)
{
as=succesor();
if(as) ev=valid();
}
if(as)
if(solutie()) tipar();
else {k++; init();}
else k--;
}
}

int main ()
{
cin>>n>>p;
bt();
return 0;
}

9.Siruri

Cerina
Se citesc dou numere naturale nenule n i m. S se determine toate irurile
cu m elemente din mulimea {1,2,..,n}, ordonate strict cresctor, cu
proprietatea c oricare dou elemente consecutive n ir au diferena mai mic
sau egal cu cu 2.

20
Restricii i precizri
1 m n 15

irurile vor fi afiate n ordine lexicografic

Exemplu
-date de intrare: 5 3
-date de iesire:
123
124
134
135
234
235
245
345

Codul sursa

#include <iostream>
using namespace std;
typedef int stiva[16];
int n, p, k, ev, as;
stiva st;
void init ()
{
st[k]=0;
}
int succesor()
{
if (st[k]<n)
{
{st[k]=st[k]+1; return 1;}
}
else return 0;
}
int valid ()
{
if ((k>1) && (st[k]<=st[k-1])) return 0;
if ((k>1) && (st[k]-st[k-1]>2)) return 0;
return 1;
}
int solutie ()
{
return k==p;
}
void tipar()
{
for(int i=1;i<=p;i++)
cout<<st[i]<<" ";
cout<<"\n";
}
void bt ()
21
{
k=1;
init ();
while(k>0)
{
as=1;ev=0;
while(as && !ev)
{
as=succesor();
if(as) ev=valid();
}
if(as)
if(solutie()) tipar();
else {k++; init();}
else k--;
}}

int main ()
{
cin>>n>>p;
bt();
return 0;
}
10.SubmDiv

Cerina
S se determine toate submulimile cu m elemente ale mulimii divizorilor unui
numr natural x dat.

Restricii i precizri
1 m 6
1 x 1000

dac nu exist soluie, pe prima linie a fiierului submdiv.out se va


afia mesajul fara solutie

Exemplu
-date de intrare: 45 4
-date de iesire:
1359
1 3 5 15
1 3 5 45
1 3 9 15
1 3 9 45
1 3 15 45
1 5 9 15
1 5 9 45
22
1 5 15 45
1 9 15 45
3 5 9 15
3 5 9 45
3 5 15 45
3 9 15 45
5 9 15 45

Codul sursa
#include <iostream>
using namespace std;
typedef int stiva[16];
int x,m,n,p,k,ev,as,a[1001];
stiva st;
void init ()
{
st[k]=0;
}
int succesor()
{
if (st[k]<n)
{
{st[k]=st[k]+1; return 1;}
}
else return 0;
}
int valid ()
{
if ((k>1) && (st[k]<=st[k-1])) return 0;
return 1;
}
int solutie ()
{
return k==m;
}
void tipar()
{
for(int i=1;i<=m;i++)
cout<<a[st[i]]<<" ";
cout<<"\n";
}
void bt ()
{
k=1;
init ();
while(k>0)
{
as=1;ev=0;
while(as && !ev)
{
as=succesor();
if(as) ev=valid();
}
if(as)
if(solutie()) tipar();
else {k++; init();}
else k--;
}}

int main ()
23
{
cin>>x>>m;

int i=0;
for( int k=1;k<=x;k++)
{
if(x%k==0)
{
i++;
a[i]=k;
}
}
n=i;
if(n<m) cout<<"fara solutie";
else
bt();
return 0;}

BIBLIOGRAFIE

Dorel Lucanu, Mitic Craus, Proiectarea algoritmilor, Editura Polirom, Iai, 2008;

Cristian A. Giumale, Introducere n analiza algoritmilor, Editura Polirom, Iai, 2004;

Clara Ionescu, Adina Balan, Informatica pentru grupele de performan, clasa a XI-a,
Editura Dacia Educaional, Cluj-Napoca, 2004;

***, http://www.campion.edu.ro

***, http://www.pbinfo.ro

24
Cuprins
MEMORIU JUSTIFICATIV.................................................................................................................................3
PREZENTARE PROGRAM/................................................................................................................................4
MEDIU DE PROGRAMARE................................................................................................................................4
DESCRIEREA APLICATIEI................................................................................................................................5
Descrierea metodei backtracking..........................................................................................................................5
1.Permutari................................................................................................................................................................5
Cerina...................................................................................................................................................................5
Restricii i precizri...............................................................................................................................................5
Exemplu...................................................................................................................................................................5
Codul sursa............................................................................................................................................................5
2.Permutari1..............................................................................................................................................................6
Cerina...................................................................................................................................................................6
Restricii i precizri...............................................................................................................................................6
Exemplu...................................................................................................................................................................7
3.Permutari2..............................................................................................................................................................8
Cerina......................................................................................................................................................................8
Restricii i precizri...............................................................................................................................................8
Exemplu...................................................................................................................................................................8
4.SirPIE...................................................................................................................................................................10
Cerina....................................................................................................................................................................10
Restricii i precizri.............................................................................................................................................10
Exemplu.................................................................................................................................................................10
5.Regine1................................................................................................................................................................12
Cerina....................................................................................................................................................................12
Restricii i precizri.............................................................................................................................................12
Exemplu.................................................................................................................................................................12
6.PermPF.................................................................................................................................................................13
Cerina....................................................................................................................................................................14
Restricii i precizri.............................................................................................................................................14
Exemplu.................................................................................................................................................................14
7.Aranjamente.........................................................................................................................................................15
Cerina....................................................................................................................................................................15
Restricii i precizri.............................................................................................................................................15
Exemplu.................................................................................................................................................................15
8.Combinari.............................................................................................................................................................17
Cerina....................................................................................................................................................................17
Restricii i precizri.............................................................................................................................................17
Exemplu.................................................................................................................................................................17
9.Siruri.....................................................................................................................................................................18
Cerina....................................................................................................................................................................18
Restricii i precizri.............................................................................................................................................18
Exemplu.................................................................................................................................................................19
10.SubmDiv............................................................................................................................................................20
Cerina....................................................................................................................................................................20
Restricii i precizri.............................................................................................................................................20
Exemplu.................................................................................................................................................................20
25
BIBLIOGRAFIE...................................................................................................................................................22

26

S-ar putea să vă placă și