题目大意:

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

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

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

  1. #include <cstdio>
  2. #include <cstring>
  3. #include <stack>
  4. using namespace std;
  5. stack<char> s;
  6. char str1[],str2[],io[];
  7. int n,m;
  8. void dfs(int x,int y,int cnt)
  9. {
  10. if(y==m){
  11. // printf("%c ",io[0]);
  12. for(int i=;i<cnt;i++)
  13. printf("%c ",io[i]);
  14. puts("");
  15. return;
  16. }
  17.  
  18. if(x<n){
  19. io[cnt]='i';
  20. s.push(str1[x]);
  21. dfs(x+,y,cnt+);
  22. s.pop();
  23. }
  24.  
  25. if(!s.empty() && s.top() == str2[y]){
  26. io[cnt]='o';
  27. char a = s.top();
  28. s.pop();
  29. dfs(x,y+,cnt+);
  30. s.push(a);
  31. }
  32. }
  33. int main()
  34. {
  35. while(~scanf("%s%s",str1,str2)){
  36. puts("[");
  37.  
  38. n=strlen(str1);
  39. m=strlen(str2);
  40. //printf("%d %d\n",n,m);
  41. while(!s.empty())
  42. s.pop();
  43.  
  44. dfs(,,);
  45.  
  46. puts("]");
  47. }
  48. return ;
  49. }

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

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

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

  1. #include <cstdio>
  2. #include <cstring>
  3. #include <stack>
  4. using namespace std;
  5.  
  6. stack<char> s;
  7. char str1[] , str2[] , io[];
  8. int n,m;
  9.  
  10. void dfs(char a,int k,int x,int y)
  11. {
  12. if(y>){
  13. if(a != str2[y-])
  14. return;
  15.  
  16. else if(y == m){
  17. for(int i=;i<k;i++)
  18. printf("%c ",io[i]);
  19. puts("");
  20. return;
  21. }
  22. }
  23.  
  24. if(y>=m)
  25. return;
  26.  
  27. if(s.empty()){
  28. if(x>=n)
  29. return;
  30. io[k] = 'i';
  31. s.push(str1[x]);
  32. dfs(a,k+,x+,y);
  33. s.pop();
  34. }
  35. else{
  36. if(x<n){
  37. io[k] = 'i';
  38. s.push(str1[x]);
  39. dfs(a,k+,x+,y);
  40. s.pop();
  41. }
  42.  
  43. io[k]='o';
  44. char b = s.top();
  45. s.pop();
  46. dfs(b,k+,x,y+);
  47. s.push(b);
  48. }
  49. }
  50.  
  51. int main()
  52. {
  53. while(~scanf("%s%s",str1,str2)){
  54. puts("[");
  55.  
  56. n=strlen(str1);
  57. m=strlen(str2);
  58. //printf("%d %d\n",n,m);
  59. while(!s.empty())
  60. s.pop();
  61.  
  62. dfs('a',,,);
  63.  
  64. puts("]");
  65. }
  66. return ;
  67. }

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. DP Codeforces Round #260 (Div. 1) A. Boredom

    题目传送门 /* 题意:选择a[k]然后a[k]-1和a[k]+1的全部删除,得到点数a[k],问最大点数 DP:状态转移方程:dp[i] = max (dp[i-1], dp[i-2] + (ll) ...

  2. ACM_求N^N的最高位数

    Leftmost Digit Time Limit: 2000/1000ms (Java/Others) Problem Description: 给定一个正整数N,你应该输出N ^ N的最左边的数字 ...

  3. 嵌套查询--------关联一对多关系----------collection

    参考来源:   http://www.cnblogs.com/LvLoveYuForever/p/6689577.html <resultMap id="BaseResultMap&q ...

  4. 科普 eclipse中的Java build

    在刚学eclipse的时候,build path是经常会用到的,但经常就是跟着教程走,额就不太懂这是干嘛的,然后今天看见极客视频里有相关的讲解,来记录一下. Build Path 是指定Java工程所 ...

  5. 文件及文件的操作-读、写、追加的t和b模式

    1.什么是文件? 文件是操作系统为用户或应用程序提供的一个读写硬盘的虚拟单位. 文件的操作核心:读和写 对文件进行读写操作就是向操作系统发出指令,操作系统将用户或者应用程序对文件的读写操作转换为具体的 ...

  6. JS获取服务器端控件ID

    很多时候我们需要在JS中对服务器端控件进行一些简单处理,但是这个时候没有必要回发到服务器,让服务器去处理,这个时候就又要用到JS了 那么怎么去获取这个服务器端控件呢?我们知道服务器最终返回到用户界面的 ...

  7. linux centos7 tomcat8 配置成服务启动

    1. tomact 解压到/usr/local/tomcat下 2.vim /usr/local/tomcat/bin/catalina.sh 在OS specific support.前加上 (注意 ...

  8. 使用Qt5.7.0 VS2015版本生成兼容XP的可执行程序

    版权声明:本文为灿哥哥http://blog.csdn.net/caoshangpa原创文章,转载请标明出处. 一.直接使用VS2012/VS2013/VS2015生成XP兼容的可执行程序 Visua ...

  9. webstorm快捷键大全-webstorm常用快捷键

    默认配置下的常用快捷键,提高代码编写效率,离不开快捷键的使用,Webstorm拥有丰富的代码快速编辑功能,你可以自由配置功能快捷键. Webstorm预置了其他编辑器的快捷键配置,可以点击 查找/代替 ...

  10. boostrapvalidator

    一个例子 <%@ page contentType="text/html;charset=UTF-8" language="java" %> < ...