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;
}

posted @ 2022-09-15 11:15  白缺  阅读(95)  评论(0编辑  收藏  举报