算法实验二 【字母转换】(回溯算法)
1143.字母转换
时限: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<string.h>
#include<stack>
using namespace std;
stack <char>s;
int length;
int in,out;//进栈出栈次数
char start[1000];//初始字符串
char target[1000];//目标字符串
char temp[2000];//中间字符串
char step[2000];//每一步的出栈入栈
void dfs(int m);
bool can();
void output();
int main()
{
while(cin>>start>>target)
{
int length1=strlen(start);
int length2=strlen(target);
in=out=0;
cout<<'['<<endl;
if(length1==length2)
{
length=length1;
dfs(0);
}
cout<<']'<<endl;
}
}
void dfs(int m)
{
if(m==length*2)
{
if(can())
{
output();
}
}
else
{
if(in<length)
{
in++;
step[m]='i';
dfs(m+1);
in--;
}
if(out<in)
{
out++;
step[m]='o';
dfs(m+1);
out--;
}
}
}
bool can()
{
int i,j,k;
for(i=0,j=0,k=0;i<length*2;i++)
{
if(step[i]=='i') s.push(start[j++]);
else
{
temp[k++]=s.top();
s.pop();
}
}
for(i=0;i<length;i++)
{
if(temp[i]!=target[i]) return false;
}
return true;
}
void output()
{
int i;
for(i=0;i<length*2-1;i++)
{
cout<<step[i]<<' ';
}
cout<<step[i]<<endl;
}
应该是10.23的代码,太懒了正好noj崩了,就没发(结果仗着noj崩了耽误了好多事)
这道题首先比较两个字符串的长度
一样的话再进行深搜
深搜时当两个字符串都捜完的时候且满足条件(按照step中储存的进栈出栈操作将初始字符串变换得到的字符串存到中间数组temp中,对比中间字符串和目标字符串是否一致,注意)时输出解