# 【AtCoder】Encyclopedia of Parentheses
## [題目連結](https://atcoder.jp/contests/typical90/tasks/typical90_b)
## **時間複雜度**
* $O(2^N)$
## **解題想法**
### **觀察**
要想解出這一題的話要先從合法的括號中觀察出幾個東西
1. 無論如何,只要 n 為**奇數**必定**無解**
2. 在任何時刻,左括號的數量**必定大於等於**右括號
3. 當左括號的數量等於右括號的數量時,**只能**放入左括號,否則一定不合法
### **實作**
在實作呼叫遞迴的部分要記得每 Call 完一次 Function 就要馬上歸還狀態,因為要輸出的 Sol 字串是開在全域的,所以不能說 Function 結束就不管他
## **完整程式**
```cpp=
/* Question : AtCoder Competitive Professional Typical 90 Questions - 002 - Encyclopedia of Parentheses(★3) */
#include<bits/stdc++.h>
using namespace std;
#define opt ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0);
#define mem(x) memset(x, 0x3F, sizeof(x));
#define pii pair<int, int>
#define pdd pair<double, double>
#define f first
#define s second
const auto dir = vector< pair<int, int> > { {1, 0}, {0, 1}, {-1, 0}, {0, -1} };
const int MAXN = 1e8 + 50;
const int Mod = 1e9 + 7;
int n;
string sol;
void generate( int l, int r ){
if( l + r == n ){
if( l == r ) cout << sol << "\n";
return;
}
if( l == r ){
sol.push_back('(');
generate(l+1, r);
sol.pop_back();
}else{
sol.push_back('(');
generate(l+1, r);
sol.pop_back();
sol.push_back(')');
generate(l, r+1);
sol.pop_back();
}
}
signed main(){
opt;
cin >> n;
if( n % 2 == 0 ) generate(0, 0);
}
```