码迷,mamicode.com
首页 > 其他好文 > 详细

ZOJ1004 && HDU1515 dfs回溯

时间:2014-09-26 01:46:48      阅读:284      评论:0      收藏:0      [点我收藏+]

标签:style   blog   color   io   ar   for   sp   div   c   

题目大意:

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

 

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

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

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <stack>
 4 using namespace std;
 5 stack<char> s;
 6 char str1[10005],str2[10005],io[10005];
 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=0;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+1,y,cnt+1);
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+1,cnt+1);
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(0,0,0);
45 
46         puts("]");
47     }
48     return 0;
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[10005] , str2[10005] , io[10005];
 8 int n,m;
 9 
10 void dfs(char a,int k,int x,int y)
11 {
12     if(y>0){
13         if(a != str2[y-1])
14             return;
15     
16         else if(y == m){
17             for(int i=0;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+1,x+1,y);
33         s.pop();
34     }
35     else{
36         if(x<n){
37             io[k] = i;
38             s.push(str1[x]);
39             dfs(a,k+1,x+1,y);
40             s.pop();
41         }
42         
43         io[k]=o;
44         char b = s.top();
45         s.pop();
46         dfs(b,k+1,x,y+1);
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,0,0,0);
63 
64         puts("]");
65     }
66     return 0;
67 }

 

ZOJ1004 && HDU1515 dfs回溯

标签:style   blog   color   io   ar   for   sp   div   c   

原文地址:http://www.cnblogs.com/CSU3901130321/p/3993930.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!