给定N对括号,输出其所有的合法的组合状态,例如,N=3,所有的合法状态为:"((()))”, “(()())”, “(())()”, “()(())”, “()()()”;
还是深搜DFS的思路,深搜的过程关键在于记录已经用掉的左括号个数和右括号的个数,当用过的左括号个数小于右括号则非法;当二者个数和大于2N则非法;当二者个数相等且数目等于2N则为合法。
代码如下:
#include <iostream> #include <cstdio> #include <cstring> #include <cstdlib> #include <set> #include <map> #include <cmath> #include <climits> #include <ctime> #include <stack> #include <queue> #include <vector> #include <algorithm> #define MAXN 1010 #define RST(N)memset(N, 0, sizeof(N)) using namespace std; char str[MAXN]; void solve(int n, int ls, int rs) { if(ls == rs && ls + rs == 2*n) { printf("%s\n", str); return ; } if(ls < rs || ls + rs >= 2*n) return ; int index = ls + rs; str[index] = '('; solve(n, ls+1, rs); str[index] = ')'; solve(n, ls, rs+1); } int main() { int n; while(~scanf("%d", &n)) { solve(n, 0, 0); } return 0; }
原文地址:http://blog.csdn.net/keshacookie/article/details/44937777