📖 Lecția 10 · Paranteze Valide

Seturi de Paranteze Valide

Generează toate combinațiile valide de n perechi de paranteze prin Backtracking — animat pas cu pas

Teorie

() Ce sunt parantezele valide?

O secvență de paranteze este validă dacă fiecare paranteză deschisă are o pereche închisă corespunzătoare, în ordinea corectă. Pentru n perechi există C(n) secvențe valide (numerele Catalan).

Exemplu pentru n=2:

(()) ()()

📐 Numerele Catalan

C(n) = C(2n,n)/(n+1)
numărul total de secvențe valide

n=1 → 1  |  n=2 → 2  |  n=3 → 5

n=4 → 14  |  n=5 → 42

🔁 Abordarea Backtracking

Algoritmul construiește secvența poziție cu poziție. La fiecare pas poate plasa ( sau ), cu două restricții: numărul de paranteze deschise nu depășește n, iar numărul de paranteze închise nu depășește pe cel al deschiselor.

💻 Cod C++ — Paranteze Valide BKT

💻 Cod C++
#include <iostream> using namespace std; int n,x[10],sol=0,u,d; void INIT(int k) { x[k]=0; } int EXISTA(int k) { if(x[k]<2) return 1; else return 0; } int VALID(int k) { int d=0,u=0; for(int i=1;i<=k;i++) if(x[i]==1) u++; // deschise else d++; // inchise if((d>n)||(u>n)) return 0; if(d>u) return 0; return 1; } int SOLUTIE(int k) { if(k==2*n) return 1; else return 0; } void TIPAR(int k) { int i; sol++; for(i=1;i<=k;i++) if(x[i]==1) cout<<"("; else cout<<")"; cout<<endl<<endl; } void BCK() { int k=1; INIT(k); while (k>0) if(EXISTA(k)) { x[k]++; if(VALID(k)) { if(SOLUTIE(k)) TIPAR(k); else {k++; INIT(k);} }} else k--; } int main() { cout << "Numarul de perechi de paranteze:" ; cin>>n; BCK(); cout<<"S-au generat "<<sol<<" solutii."<<endl; return 0; }
Simulare interactivă — n = 2
n =
Viteză:
Secvența curentă
( deschise: 0 / 2
) închise: 0
Apasă ▶ Rulează pentru a porni simularea
Pas: 0/0
Soluții găsite: 0 / 2
Soluții găsite
Nicio soluție găsită încă...