UVa 732

来源:互联网 发布:2017年快餐行业数据 编辑:程序博客网 时间:2024/06/08 05:10

题目:已知两个单词,利用一个栈,将第一个单词变成第二个单词,求出所有可能的操作序列。

分析:模拟,搜索,数据结构。利用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;}


原创粉丝点击