字母转换(深搜)

来源:互联网 发布:linux坏了怎么卸载 编辑:程序博客网 时间:2024/06/06 23:52

时限: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 <stdio.h>#include <stack>#include <string.h>using namespace std;struct  MyString{char s[102];int length;};MyString s1, s2;//s1初始字串,s2目标字串char ans[102];void write(){int i;for (i = 0; i <= s2.length * 2 - 1; i++){printf("%c ", ans[i]);}printf("\n");return;}void dfs(int n, int m, stack<char> s, int i)//s1第n个,s2第m个,当前的栈为s,解的下标为i{if (m >= s2.length&&n>=s1.length&&s.empty()){write();return;}if (n >= s1.length&&s.top() != s2.s[m]){return;}if (s.empty() || s.top() != s2.s[m]){s.push(s1.s[n]);ans[i] = 'i';dfs(n + 1, m, s, i + 1);}else{s.push(s1.s[n]);ans[i] = 'i';dfs(n + 1, m, s, i + 1);s.pop();//还原栈s.pop();//下一种情况,相等出栈ans[i] = 'o';dfs(n, m + 1, s, i + 1);}return;}int main(){stack<char> s0;char x[102];while (scanf("%s", x) != EOF){strcpy(s1.s, x);s1.length = strlen(s1.s);scanf("%s", s2.s);s2.length = strlen(s2.s);while (!s0.empty()){s0.pop();}printf("[\n");if (s1.length == s2.length){dfs(0, 0, s0, 0);}printf("]\n");}return 0;}

0 0
原创粉丝点击