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\n",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("\n"); 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("[\n"); 53 dfs(0,0,0); 54 printf("]\n"); 55 } 56 return 0; 57 }