题目: 编程实现所有括号的合法匹配。实例如下:
输入 3
输出 ((())) (()()) (())() ()(()) ()()()
解题思路:
学名为:深度优先搜索(DFS) 这是看别人的文章得到的名称。。。
代码如下:
#include "stdafx.h"
#include "iostream"
#include "stdio.h"
#include
#include
using namespace std;
void func(int left, int right , vector& str){
if( left != 0 ){
str.push_back( '(' );
func( left-1, right, str);
str.pop_back();
}
if ( right != 0){
if ( left < right){
str.push_back( ')' );
func( left, right-1, str);
str.pop_back();
}
}
if ( right == 0 ){
for( int i = 0; i < str.size(); i++)
cout<<str[i];
cout << endl;
}
return;
}
int main( ){
int n;
vector str;
cin >> n;
func( n, n, str);
return 1;
}
程序运行状态解释如下:
输入 3
函数调用栈如下
step1:
func(3,3) push( “(” 调用func(2, 3)
step2:
func(2,3) push ( “((” 调用func(1, 3)
func(3,3)
step3:
func(1,3) push ( “(((” 调用func(0, 3)
func(2,3)
func(3,3)
step4:
func(0,3) push) “((()” 调用func(0, 2)
func(1,3)
func(2,3)
func(3,3)
…此处不再赘述
step7:
func(0,0) print “((()))” return
func(0,1)
func(0,2)
func(0,3)
func(1,3)
func(2,3)
func(3,3)
接下来这一步是看懂这个递归的重点
step8:
func(0,1) pop “((())” return
func(0,2)
func(0,3)
func(1,3)
func(2,3)
func(3,3)
step9:
func(0,2) pop “((()” return
func(0,3)
func(1,3)
func(2,3)
func(3,3)
step10:
func(0,3) pop “(((” return
func(1,3)
func(2,3)
func(3,3)
此处的处理是第二个重点。程序开始第二次遍历
step11:
func(1,3) pop “((” push) “(()” 调用func(1, 2)
func(2,3)
func(3,3)
step12:
func(1,2)push( “(()(” 调用func(0, 2)
func(1,3)
func(2,3)
func(3,3)
此处省略部分步骤
step k:
func(0,0)print “(()())” return
func(0,1)
func(0,2)
func(1,2)
func(1,3)
func(2,3)
func(3,3)
继续省略一些过程
step l:
func(2,3)pop “(” push) “()” 调用func(2, 2)
func(3,3)
- 作者:guanzi
- 本博客所有内容均在《“署名-非商业用途-保持一致”的创作共用协议》下发布
- 全文转载,必须包含本版权信息;部分转载或引用,请注明作者署名与文章出处
- 本文链接:http://guanzi.info/2013/08/%e6%90%9c%e7%8b%90%e7%ac%94%e8%af%95%e6%98%be%e7%a4%ba%e6%89%80%e6%9c%89%e6%ad%a3%e7%a1%ae%e7%9a%84%e6%8b%ac%e5%8f%b7%e5%8c%b9%e9%85%8d/