题目大意:

就是通过一个栈进行字母入栈出栈得到想要的字符,把所有可能的方式全部输出

自己写的方法一开始一直不能过,后来参考了别人的方法,写出来的比较简单的代码

这段代码更有回溯的感觉,自己后来又把自己原来想法的代码写了一遍,终于写出来了,不过有点让人头晕

 #include <cstdio>
#include <cstring>
#include <stack>
using namespace std;
stack<char> s;
char str1[],str2[],io[];
int n,m;
void dfs(int x,int y,int cnt)
{
if(y==m){
// printf("%c ",io[0]);
for(int i=;i<cnt;i++)
printf("%c ",io[i]);
puts("");
return;
} if(x<n){
io[cnt]='i';
s.push(str1[x]);
dfs(x+,y,cnt+);
s.pop();
} if(!s.empty() && s.top() == str2[y]){
io[cnt]='o';
char a = s.top();
s.pop();
dfs(x,y+,cnt+);
s.push(a);
}
}
int main()
{
while(~scanf("%s%s",str1,str2)){
puts("["); n=strlen(str1);
m=strlen(str2);
//printf("%d %d\n",n,m);
while(!s.empty())
s.pop(); dfs(,,); puts("]");
}
return ;
}

不断传入出栈的值和对应的str2上的字符进行比较,只有一只匹配正确才继续,若匹配成功最后一个字符,就输出io[]保存的过程字符

k表示保存了k个过程符,x表示str1入栈了x个字符,y表示比较到了str2的第y个字符

自己写的过程中因为想不到上面那么好的思路,就有点乱,防止数组越界,只能不断加各种限制,自己的思路想想应该还是只有自己看得懂吧~~

 #include <cstdio>
#include <cstring>
#include <stack>
using namespace std; stack<char> s;
char str1[] , str2[] , io[];
int n,m; void dfs(char a,int k,int x,int y)
{
if(y>){
if(a != str2[y-])
return; else if(y == m){
for(int i=;i<k;i++)
printf("%c ",io[i]);
puts("");
return;
}
} if(y>=m)
return; if(s.empty()){
if(x>=n)
return;
io[k] = 'i';
s.push(str1[x]);
dfs(a,k+,x+,y);
s.pop();
}
else{
if(x<n){
io[k] = 'i';
s.push(str1[x]);
dfs(a,k+,x+,y);
s.pop();
} io[k]='o';
char b = s.top();
s.pop();
dfs(b,k+,x,y+);
s.push(b);
}
} int main()
{
while(~scanf("%s%s",str1,str2)){
puts("["); n=strlen(str1);
m=strlen(str2);
//printf("%d %d\n",n,m);
while(!s.empty())
s.pop(); dfs('a',,,); puts("]");
}
return ;
}

ZOJ1004 && HDU1515 dfs回溯的更多相关文章

  1. 素数环(dfs+回溯)

    题目描述: 输入正整数n,把整数1,2...n组成一个环,使得相邻两个数和为素数.输出时从整数1开始逆时针排列并且不能重复: 例样输入: 6 例样输出: 1 4 3 2 5 6 1 6 5 2 3 4 ...

  2. NOJ 1074 Hey Judge(DFS回溯)

    Problem 1074: Hey Judge Time Limits:  1000 MS   Memory Limits:  65536 KB 64-bit interger IO format: ...

  3. HDU 1016 Prime Ring Problem(经典DFS+回溯)

    Prime Ring Problem Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Other ...

  4. HDU 2181 哈密顿绕行世界问题(经典DFS+回溯)

    哈密顿绕行世界问题 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total ...

  5. HDU1016 Prime Ring Problem(DFS回溯)

    Prime Ring Problem Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Other ...

  6. uva 193 Graph Coloring(图染色 dfs回溯)

    Description You are to write a program that tries to find an optimal coloring for a given graph. Col ...

  7. P1074 靶形数独 dfs回溯法

    题目描述 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们向 Z 博士请教,Z 博士拿出了他最近发明的“靶 ...

  8. 剪格子---(dfs回溯)

    如图p1.jpg所示,3 x 3 的格子中填写了一些整数. 我们沿着图中的红色线剪开,得到两个部分,每个部分的数字和都是60. 本题的要求就是请你编程判定:对给定的m x n 的格子中的整数,是否可以 ...

  9. 蓝桥杯 算法提高 8皇后·改 -- DFS 回溯

      算法提高 8皇后·改   时间限制:1.0s   内存限制:256.0MB      问题描述 规则同8皇后问题,但是棋盘上每格都有一个数字,要求八皇后所在格子数字之和最大. 输入格式 一个8*8 ...

随机推荐

  1. Apusic中间件结合MyEclipse进行远程调试记录

    Apusic中间件结合MyEclipse进行远程调试记录. 在金蝶域中正常部署应用. 启动金蝶中间件时使用"startapusic -ds"命令. 在MyEclipse的Run-- ...

  2. VS2010的一个错误,无法加载类型

    一个解决方案中的一个项目X,启动时总是报错,无法加载一个同一个解决方案中另一个项目A生成EXE中的数据类型. 做了如下的步骤解决问题. 1:检查项目A,未发现错误,调试启动A,一切正常. 2:检查项目 ...

  3. SQL快速备份

    ALTER  PROCEDURE [dbo].[usp_Backup_DataBase]    (      @BackupDataBaseName VARCHAR(128)    )AS    BE ...

  4. git ---查看工作状态和历史提交

    1.git查看状态 -git status 2.版权声明 版权声明:新建一个   LICENSE.txt   文件 开源协议:MIT   //开源许可里面的最宽松的一个协议,别人可以随便用你的代码,但 ...

  5. js控制页面跳转,清缓存,强制刷新页面

    单看标题,必定满脸蒙13. 其实,想表达的仅仅是,在js中通过window.location.href控制页面跳转时,有时会跳转至缓存页面,并没有真正去请求要跳转的地址,导致页面数据未能及时加载刷新. ...

  6. frame方式布局一段文子,设置宽高

    计算一段文字的宽高 /** * 计算一段文字的宽高 * * @param size 这段文字的最大宽高 * @param options NSStringDrawingUsesLineFragment ...

  7. CentOS 6.4 linux下编译安装MySQL5.6.14

    CentOS 6.4下通过yum安装的MySQL是5.1版的,比较老,所以就想通过源代码安装高版本的5.6.14. 正文: 一:卸载旧版本 使用下面的命令检查是否安装有MySQL Server rpm ...

  8. Ryubook_1_switch_hub_源码

    一.switching hub by openflow: 用Ryu实现一个有如下功能的switching hub. • Learns the MAC address of the host conne ...

  9. Python界面编程之六----布局

    布局(转载于–学点编程吧)通过实践可知采用了布局之后能够让我们的程序在使用上更加美观,不会随着窗体的大小发生改变而改变,符合我们的使用习惯. 绝对位置程序员以像素为单位指定每个小部件的位置和大小. 当 ...

  10. splice用法解析

    splice()方法算是最强大的数组方法了,它有很多种用法,主要用于删除指定位置的数组项,在指定的位置插入数组项,在指定位置替换数组项,slpice()方法始终都会返回一个数组,该数组包括从原始数组中 ...