分析:简单的穷举一下,要加点剪枝,例如:任何时候(除最后操作)出栈数要小等于入栈数,最后的出栈数应该与入栈数相等,还有要按题目的要求排序。

Code
#include <iostream>
#include <stack>
#include <cmath>
using namespace std;

int len;
char source[1001],target[1001];
void Display(char *str)


{
for(int i=0;i<len;++i)
cout<<str[i]<<" ";
cout<<endl;
}

bool CheckFlag(char* str)


{
int o=0,i=0;
for(int t=0;t<len;++t)

{
if(str[t] == 'i')
++i;
else
++o;
if(o>i)
return false;
}
if(o!=i)
return false;
else
return true;
}
bool CheckStack(char *source,char *flag,char *target)


{
if(!CheckFlag(flag))
return false;
int st=0,tt=0;
stack<char> stac;
for(int i=0;i<len;++i)

{
if(flag[i] == 'i')
stac.push(source[st++]);
else

{
char c=stac.top();
stac.pop();
if(c != target[tt++])
return false;
}
}
return true;
}
void sub(char *str)


{
int i=len-1;
while(i>=0)
if(str[i] == 'i')

{
str[i] = 'o';
break;
}
else

{
str[i] = 'i';
--i;
}
}
int main()


{
char flag[1001];
while(cin>>source)

{
cin>>target;
len = strlen(source)*2;
memset(flag,'i',len*sizeof(char));
long long end=(long long)pow(2.0,(double)len);
cout<<'['<<endl;
for(long long i=0;i<end;++i,sub(flag))
if(CheckStack(source,flag,target))
Display(flag);
cout<<']'<<endl;
}
return 0;
}
