#include <iostream>
#include <vector>
#include <stack>
#include <set>
#include <string>
#include <algorithm>
using namespace std;//L为左括号数,R为右括号数,限制条件为L<n&&R<L才是正确的括号序列
void traceback(string& t, vector<string>& ans, int L, int R, int n) {
if (L==n&&R==n) {
ans.push_back(t);
return;
}
if (L < n) {
t += '(';
traceback(t, ans, L + 1, R, n);
t = t.substr(0, t.size() - 1);
}
if (R < L) {
t += ')';
traceback(t, ans, L, R + 1, n);
t = t.substr(0, t.size() - 1);
}
}
vector<string> generateParenthesis(int n) {
int L = 0, R = 0;
string t;
vector<string> ans;
traceback(t, ans, 0, 0, n);
return ans;
}
int main(void) {
vector<string> ans=generateParenthesis(3);
for (int i = 0; i < ans.size();i++) {
cout << ans[i] << endl;
}
return 0;
}