Problem J
字母转换
时限:1000ms 内存限制:10000K 总时限:3000ms
描述:
通过栈交换字母顺序。给定两个字符串,要求所有的进栈和出栈序列(i表示进栈,o表示出栈),使得字符串2在求得的进出栈序列的操作下,变成字符串1。输出结果需满足字典序。例如TROT 到 TORT:
[
i i i i o o o o
i o i i o o i o
]
输入:
给定两个字符串,第一个字符串是源字符串,第二个字符是目标目标字符串。
输出:
所有的进栈和出栈序列,输出结果需满足字典序
输入样例:
madam adamm bahama bahama long short eric rice
输出样例:
[ 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 ]
#include<iostream>
#include<stack>#include<stdlib.h>
#include<string>
#include<cstring>
#include<stdio.h>
using namespace std;
int a[100];//i : push -1 :pop
int in = 0;
int out = 0;
int count = 0;
bool match(char*inp,char*tar)
{
stack<char> s;
char t[100];
int l = 0;
int ll=0;
for(int i = 0; i<strlen(inp)*2;i++)//根据递归得到的而二进制排列组合判断进栈和出栈
{
if(a[i] == 1)
{
s.push(inp[ll++]);//若该数组中元素值为1,入栈
}
else
{
if(s.empty())//检查栈是否为空
return false;
t[l]=s.top();//栈顶元素出栈
l++;
s.pop();//弹出栈顶元素
}
}
for(int i = 0 ;i < strlen(inp);i++)//检查此种进出栈方式得到的字符串是否满足题意
{
if(t[i]!=tar[i])return false;
}
return true;}
void calc(char*inp,char*tar)
{
if(in<out)return;进栈次数小于出栈次数,显然不成立
if(in+out>=2*strlen(inp)){
if(match(inp,tar))//若得到的进出栈方式满足题意,输出该序列
{
for(int i = 0;i<2*strlen(inp);i++)
{
if(a[i]==1&&i!=2*strlen(inp)-1)//每一行结尾不能有空格cout<<"i ";
else if(a[i]==-1&&i!=2*strlen(inp)-1)
cout<<"o ";
else if(a[i]==1&&i==2*strlen(inp)-1)
cout<<"i";
else if(a[i]==-1&&i==2*strlen(inp)-1)
cout<<"o";
}
cout<<endl;
}
return ;
}
if(in<strlen(inp))//递归得到不同种进出栈组合方式
{
a[in+out] = 1;
in++;
calc(inp,tar);
in--;
}
if(out<strlen(inp))
{
a[in+out] = -1;
out++;
calc(inp,tar);
out--;
}
}
int main()
{
char aa[100];
char bb[100];
while(scanf("%s",&aa)!=EOF&&scanf("%s",&bb)!=EOF)
{
cout<<"["<<endl;
calc(aa,bb);
cout<<"]"<<endl;
}
return 0;
}