Problem P23. [算法课回溯]括号生成
具有阶段性的问题可以采用回溯的方法,选择深度遍历的方法将所有的可能性遍历出来,在这过程中去掉一些不可能的分支。
#include<iostream>
#include<bits/stdc++.h>
#include<cstdio>
using namespace std;
int n;
vector<string> strs;
void dfs(int left, int right, string curstr)
{
// 递归函数先写出结束语句
if (right==0 && left==0){
strs.push_back(curstr);
return;
}
// 剪枝的判断语句,未满足条件即结束递归
if (left<=right&&left>=0){
dfs(left-1, right, curstr+"(");
dfs(left, right-1, curstr+")");
}
}
int main()
{
cin >> n;
dfs(n, n, "");
cout << "[";
for (int i = 0; i < strs.size(); i++){
cout << strs[i];
if (i!=strs.size()-1){
cout << ", ";
}
}
cout << "]";
return 0;
}