题目:已知两个单词,利用一个栈,将第一个单词变成第二个单词,求出所有可能的操作序列。
分析:模拟,搜索,数据结构。利用dfs搜索求解。
利用四个串以及对应的下标记录搜索状态:当前输入,当前栈,当前输出,目标输出;
搜索时只有两种可能:input到stack,stack到output,为了回溯生成对应的逆操作;
说明:注意数据中有空行。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char input[101];
char target[101];
char stack[101];
char output[101];
int p_i, p_s, p_o;
int move[202];
void dfs(int index, int n)
{
if (p_o == n-1) {
printf("%c",move[0]);
for (int i = 1; i < index; ++ i) {
printf(" %c",move[i]);
}
printf("\n");
}else {
if (p_i < n) {
move[index] = 'i';
stack[++ p_s] = input[p_i ++];
dfs(index+1, n);
input[-- p_i] = stack[p_s --];
}
if (p_s >= 0 && p_o < n-1 && target[p_o+1] == stack[p_s]) {
move[index] = 'o';
output[++ p_o] = stack[p_s --];
dfs(index+1, n);
stack[++ p_s] = output[p_o --];
}
}
}
int main()
{
while (gets(input)) {
gets(target);
puts("[");
p_i = 0, p_s = -1, p_o = -1;
if (strlen(input) == strlen(target)) {
dfs(0, strlen(input));
}
puts("]");
}
return 0;
}