模拟栈的回溯,完全二叉树搜索,(ZOJ1004)
2016-03-22 22:12
260 查看
题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1004
解题报告:
①方法:完全二叉树的搜索方式,回溯法。
②代码解释:
1、可以一直入栈,当不能入栈的时候,就只能出栈了。
2、先入栈,再出栈。保证堆栈弹出的时候不为空。
3、当dfs(i,j)完成之后(i>1),可以进行出栈操作的时候,进行dfs(i,j+1),来逼近答案。
解题报告:
①方法:完全二叉树的搜索方式,回溯法。
②代码解释:
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; }
相关文章推荐
- 自定义Dialog的详细步骤(实现自定义样式一般原理)
- Maven简介
- Java——按钮组件:JButton
- [转] Mac 下 PostgreSQL 的安装与使用
- 记嵌入式硬件开发实习——altium designer的使用
- Android开发艺术探索读书笔记(二)
- 我说《古炉》之狗尿苔
- windows上安装linux系统,黑屏进不到桌面解决办法
- HTTP权威指南学习笔记:连接管理
- 《HP大中华区总裁孙振耀退休感言》
- 作业4(第一部分)
- 作业三
- 求最大连续子数列和(只扫描一次数列)
- iOS 截取字符串中汉字 —— HERO博客
- C++11新特性学习笔记
- Codeforces 645C:Enduring Exodus
- Java for循环的几种写法
- Activity_Class_Fragments
- cookie 和session 的区别详
- 【poj 3126】Prime Path 题意&题解&代码(C++)