Documente Academic
Documente Profesional
Documente Cultură
PROGRAMARE
Nume:Lungu Andreea
Clasa:a XI-a B
Prof:Vlad Catalina
EXEMPLE:
• Backtracking
• Divide et impera
• Greedy
• Programare dinamica
BACKTRACKING
v[k]=0;} if(v[k]<n) {
v[k]++;
return 1; }
else return 0; }
• Functia Valid:
{for(i=1;i<=m;i++)
for(j=1;j<=n;j++)
s=0;
if(a[i][j]%2==0 && i%2==1 && j
%2==1)
s+=a[i][j];}
3.Să se afişeze toate anagramele unui cuvânt citit de la {for(int i=1;i<=n;i++)
tastatura. {
cout<<"("<<i<<","<<st[i]<<") ";
#include <iostream> }
using namespace std; cout<<endl;
typedef int stiva[100]; }
int n,k,as,ev; void bt()
int v[100]; {
stiva st; k=1;
void (init()) init ();
{ while (k>0)
st[k]=0; {
} as=1; ev=0;
int succesor() while(as&&!ev)
{ {
if(st[k]<n) as=succesor();
{ if (as)
st[k]+=1; ev=valid();
return 1;} }
else return 0; if(as)
} if(solutie())
int valid() tipar ();
{ else{k++;
for(int i=1;i<k;i++) init();}
if(st[k]==st[i]) else k--;
return 0; }
return 1; }
} int main()
int solutie() {cin>>n;
{ bt();}
return k==n;
}
void tipar ()
4.Să se genereze toate funcţiile bijective f:A➛B,unde {for(int i=1;i<=n;i++)
card(A)=card(B)=n. {
cout<<"("<<i<<","<<st[i]<<") ";
#include <iostream> }
using namespace std; cout<<endl;
typedef int stiva[100]; }
int n,k,as,ev; void bt()
int v[100]; {
stiva st; k=1;
void (init()) init ();
{ while (k>0)
st[k]=0; {
} as=1; ev=0;
int succesor() while(as&&!ev)
{ {
if(st[k]<n) as=succesor();
{ if (as)
st[k]+=1; ev=valid();
return 1;} }
else return 0; if(as)
} if(solutie())
int valid() tipar ();
{ else{k++;
for(int i=1;i<k;i++) init();}
if(st[k]==st[i]) else k--;
return 0; }
return 1; }
} int main()
int solutie() {cin>>n;
{ bt();}
return k==n;
}
void tipar ()
5.Să se genereze toate posibilităţile de a aranjare pe o casetă a N cout << '\n';
melodii, astfel încât melodia x să se cânte după melodia y. }
#include <iostream> void bt()
using namespace std; {
typedef int stiva[100]; k = 1;
int n, k, as, ev, x, y; init();
stiva st; while(k > 0)
void init() { {as = 1;ev = 0;
st[k] = 0; } while(as && !ev)
int succesor() { {
if(st[k] < n) { as = succesor();
st[k] = st[k] + 1; if(as)
return 1; } ev = valid();
else return 0;} }
int valid() { if(as)
for(int i = 1;i < k; ++i) if(solutie())
if(st[k] == st[i]) return 0; tipar();
if(st[k] == x && st[k - 1] != y) return 0; else{k++; init();}
return 1;} else k— ; }}
int solutie() int main()
{ { cin >> n >> x >> y;
return k == n; bt();
} return 0;
}
void tipar()
DIVIDE ET IMPERA
Divide et impera este o tehnică specială prin care se pot rezolva anumite
probleme. Tehnica Divide et Impera constă în două mari etape:
Divide. Problema dată este împărţită în două sau mai multe
subprobleme de acelaşi tip, dar de dimensiuni mai mici. Subproblemele
se rezolvă direct, dacă dimensiunea lor permite aceasta (cazuri
elementare), sau, fiind de acelaşi tip, se rezolvă în mod recursiv, prin
acelaşi procedeu.
• dacă da atunci
➝ va fi adăugat şi mulţimea soluţiilor devine S=S∪{x} - un element introdus
în
mulţimea S nu va mai putea fi eliminat
• altfel
➝ el nu se mai testează ulterior
➝ procedeul continuă, până când au fost determinate toate elementele din
mulţimea soluţiilor
Problema 1 int alege(int k)
Colorarea hartii folosind metoda Greedy. { for(int i=1;i<=4;i++)
Fiind data o harta cu n tari, se cere o solutie de {
colorare a hartii, utilizand cel mult patru culori, X[k]=i;
astfel incat doua tari ce au frontiera comuna sa fie if(valid(k)) return i;
colorate diferit. Este demonstrat faptul ca sunt }
suficiente numai patru culori pentru ca orice harta sa return 0;}
poata fi colorata.
void colorare()
#include <fstream> { for(int i=1;i<=n;i++)
using namespace std; X[i]=alege(i);}
ifstream fin("colorare.in");
ofstream fout("colorare.out"); int main()
{
int A[101][101];// A[i][j]==1 pt tari vecine, 0 altfel int t1,t2;
int X[101],n;//X[i]=indicele culorii tarii i fin>>n;
char C[5][21];//culorile for(int i=1;i<=4;i++)
fin>>C[i];
void afisare() while(fin>>t1>>t2)
{ {A[t1][t2]=1;
for(int i=1;i<=n;i++) A[t2][t1]=1; }
fout<<i<<" “<<C[X[i]]<<"\n"; colorare();
fout<<endl; } afisare();
return 0;}
int valid(int k)
{ for(int i=1;i<k;i++)
if(A[i][k]==1 && X[i]==X[k]) return 0;
return 1;
}
Problema 2 }
Intr-o sala de spectacol trebuie planificate n spectacole
intr-o zi. Pentru fiecare spectacol se cunosc ora de { void afisare(int n, spectacol a[])
inceput si ora de terminare (numere intregi). for(int i=1;i<=n;i++)
Sa se planifice un numar maxim de spectacole astfel inct fout<<a[i].s<<","<<a[i].d<<" ";
sa nu fie doua spectacole care sa se suprapuna. }