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