Documente Academic
Documente Profesional
Documente Cultură
VASLUI
Profesor ndrumtor,
Nicu Vlad Laureniu
Candidat,
Croitoru Nicolae Radu
2017
2
Algoritmi de combinatorica
3
MEMORIU JUSTIFICATIV
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.
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).
5
DESCRIEREA APLICATIEI
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
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;
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
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
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
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
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;
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