用栈来模拟操作,主要还是DFS
注意回溯条件,还有遍历失败后的操作就没什么了
#include<iostream>
#include<stack>
#include<string>
#include<algorithm>
using namespace std;
char b[200],b1[100],b2[100];//b[]保存路径
stack<char> ST;
int len1,len2;
int cmp( const void* c1,const void* c2)
{
return *(char *)c1-*(char *)c2;
}
void dfs(int a1,int a2)
{
if(a1==a2&&a1==len1)
{
for(int i=0;i<len1*2;i++)
cout<<b[i]<<' ';
cout<<endl;
return ;
}
if(a1<=len1)
{
b[a1+a2]='i';
ST.push(b1[a1]);
dfs(a1+1,a2);
ST.pop();//回溯时,记得将栈顶元素出栈
}
if(!ST.empty()&&a2<len1)
{
if(ST.top()==b2[a2])
{
b[a1+a2]='o';
ST.pop();
dfs(a1,a2+1);
ST.push((b2[a2]));//同样,记得要压回
}
}
return ;
}
int main()
{
char str1[100],str2[100];
while(cin>>b1>>b2)
{
while(!ST.empty())
{
ST.pop();
}
int flag=0;
len1=strlen(b1);
len2=strlen(b2);
if(len1!=len2)
{
flag=1;
}
else
{
strcpy(str1,b1);
strcpy(str2,b2);
qsort(str1,len1,sizeof(char),cmp);
qsort(str2,len1,sizeof(char),cmp);
if(!strcmp(str1,str2))//判断俩个字符串所含元素是否相同
{
b[0]='i';
ST.push(b1[0]);
cout<<'['<<endl;
dfs(1,0);
cout<<']'<<endl;
}
else flag=1;
}
if(flag)
cout<<'['<<endl<<']'<<endl;
}
return 0;
}