#pbinfo Problema #344 - Paranteze de pe#pbinfo se rezolvă cu backtracking
Cerința
Se dă un număr natural par
n. Generați toate șirurile denparanteze rotunde care se închid corect.
Explicație
Condițiile ca un șir să fie corect sunt următoarele(considerăm numărul de paranteze deschise și numărul de paranteze închise):
- Dacă nu mai putem închide o paranteză nouă (secvența
(()))(este invalidă), deci putem închide paranteze doar când - La final Deci structura funcției de generare este următoarea:
- Dacă am ajuns cu pasul,
kla n, afișăm - Altfel
- Dacă
pd<n/2adăugăm o(și reapelăm funcția trecând la următorul pas și incrementândpd - Dacă
pi<n/2șipi<pdadăugăm o)și reapelăm funcția trecând la următorul pas și incrementândpi
- Dacă
Soluția:
#include <fstream>
using namespace std;
ifstream fin("paranteze.in");
ofstream fout("paranteze.out");
char s[20];
int n;
void generare(int k, int pi, int pd) {
if (n == k) {
fout << s << endl;
} else {
if (pd < n / 2) {
s[k] = '(';
generare(k + 1, pi, pd + 1);
}
if (pi < n / 2 && pi < pd) {
s[k] = ')';
generare(k + 1, pi + 1, pd);
}
}
}
int main() {
int n;
fin >> n;
generare(n, 0, 0, 0);
}Varianta din curs

Varianta ineficientă din curs, care folosește funcția Valid()
