题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1004
解题报告:
①方法:完全二叉树的搜索方式,回溯法。
②代码解释:
1、可以一直入栈,当不能入栈的时候,就只能出栈了。
2、先入栈,再出栈。保证堆栈弹出的时候不为空。
3、当dfs(i,j)完成之后(i>1),可以进行出栈操作的时候,进行dfs(i,j+1),来逼近答案。
#include <iostream> #include <string> #include <algorithm> #include <stack> #include <vector> using namespace std; string a,b;///原单词和目标单词; stack <char> build;///构造目标字符串 vector <char> operate;///记录出入栈操作 int len;///字符串a长度 ///iPush表示入栈操作的次数,iPop表示出栈操作的次数; void dfs(int iPush,int iPop) { ///当出入栈操作的次数刚好等于字符串长度时,目标单词构造完成。 if(iPush==len&&iPop==len) { for(int i=0;i<operate.size();i++) cout<<operate[i]<<" "; cout<<endl; } ///入栈操作; if(iPush+1<=len) { build.push(a[iPush]); operate.push_back('i'); dfs(iPush+1,iPop); build.pop(); operate.pop_back(); } ///出栈操作; if(iPop+1<=iPush&&iPop+1<=len&&build.top()==b[iPop]) { char tc=build.top(); build.pop(); operate.push_back('o'); dfs(iPush,iPop+1); build.push(tc); operate.pop_back(); } } int main() { while(cin>>a>>b) { len=a.length(); cout<<"["<<endl; dfs(0,0); cout<<"]"<<endl; } return 0; }