题意:有两个单词,能否通过对第一个单词进行出栈和入栈操作,输出第二个单词,如果能则输出全部相应的出栈入栈操作,出栈为o,入栈为i,
思路:dfs深搜,注意一些条件的判断,
看了别人的思路后自己写了一遍,输出时却出现的只输出一组解的情况,百思不得其解,一遍又一遍比对及实验后(恨不得直接把人家的代码复制过来),才发现是在对dfs深搜后的恢复上出现了问题,本应先y--,然后入栈b[y], 我写成了先入栈后y--, 恢复的顺序问题值得深思啊
#include<iostream>
#include<stdio.h>
#include<stack>
#include<cstring>
using namespace std;
char a[100000],b[100000],out[200000];//out数组记录操作
int len1,len2,x,y;
stack <char> num;
void dfs(int k)
{
if(y==len1)
{
for(int i=0;i<len2*2;i++)
printf("%c ",out[i]);
printf("\n");
}
if(x<len1)//入栈操作
{
num.push(a[x]);
x++;
out[k]='i';
dfs(k+1);//注意dfs后恢复相应的值
x--;
out[k]=0;
num.pop();
}
if(!num.empty() && num.top()==b[y])
{
out[k]='o';
y++;
num.pop();
dfs(k+1);
y--; //特别注意这里y--在前面保证push(b[y])是原来的b[y] 否则会只输出一组解
num.push(b[y]);
out[k]=0;
}
}
int main()
{
freopen("in.txt","r",stdin);
while(~scanf("%s%s",a,b))
{
len1=strlen(a);
len2=strlen(b);
x=y=0;
printf("[\n");
if(len1==len2)
dfs(0);
printf("]\n");
}
}