hdu 1515 dfs

一道不错的搜索题

题意:告诉你两个字符串a和b,要求对a进行栈的操作而产生b串,输出操作的顺序,如果有多组输出就按字典序输出。

Sample Input

madam
adamm
bahama
bahama
long
short
eric
rice
Sample Output
[
i i i i o o o i o o 
i i i i o o o o i o 
i i o i o i o i o o 
i i o i o i o o i o 
]
[
i o i i i o o i i o o o 
i o i i i o o o i o i o 
i o i o i o i i i o o o 
i o i o i o i o i o i o 
]
[
]
[
i i o i o i o o 
]

这道搜索题不太好理解,通过输出中间变量来辅助理解,这里是第一个例子
[
0 0 0
1 0 1
2 0 2
3 0 3
4 0 4
5 0 5  //到这里madam全部进入栈中
4 1 5  //5 0 5状态均不符合任何if,退出,由 4 0 4 开始,符合最后一个条件
5 1 6  //符合第二个if,之后不符合任何条件,由4 1 5开始
4 2 6
5 2 7
4 3 7
5 3 8
5 4 9
5 5 10
i i i i o o o i o o
4 4 8
5 4 9
5 5 10
i i i i o o o o i o
2 1 3
3 1 4
4 1 5
5 1 6
3 2 5
4 2 6
5 2 7
4 3 7
5 3 8
5 4 9
5 5 10
i i o i o i o i o o
4 4 8
5 4 9
5 5 10
i i o i o i o o i o
]
 1 #include<cstdio>
 2 #include<iostream>
 3 #include<algorithm>
 4 #include<cstring>
 5 #include<cmath>
 6 #include<queue>
 7 #include<stack>
 8 using namespace std;
 9 int n,m,t;
10 int len1,len2;
11 int num[500];
12 char s1[500],s2[500] ;
13 stack<int> q;
14 int tot=0;
15 void dfs(int i,int j,int k) //s1的状态,s2的状态,当前栈的元素数目
16 {
17     //printf("%d %d %d
",i,j,k);
18     if(j==len2)
19     {
20         for(i=0;i<k;i++)
21         {
22             if(num[i])  printf("i ");
23             else printf("o ");
24         }
25         printf("
");
26         return;
27     }
28     if(i<len1)
29     {
30         q.push(s1[i]);
31         num[k]=1;
32         dfs(i+1,j,k+1);
33         q.pop();
34     }
35     if(!q.empty()&&q.top()==s2[j])
36     {
37         char ss=q.top();
38         q.pop();
39         num[k]=0;
40         dfs(i,j+1,k+1);
41         q.push(ss);
42     }
43 }
44 int main()
45 {
46     int i,j,k;
47     //freopen("1.in","r",stdin);
48     while(scanf("%s%s",s1,s2)!=EOF)
49     {
50         len1=strlen(s1);
51         len2=strlen(s2);
52         printf("[
");
53         dfs(0,0,0);
54         printf("]
");
55     }
56     return 0;
57 }
原文地址:https://www.cnblogs.com/cnblogs321114287/p/4282363.html