问题:
How can anagrams result from sequences of stack operations? There are two sequences of stack operators which can convert TROT to TORT:
[
i i i i o o o o
i o i i o o i o
]
whereistands for Push andostands for Pop. Your program should, given pairs of words produce sequences of stack operations which convert the first word to the second.
Input
The input will consist of several lines of input. The first line of each pair of input lines is to be considered as a source word (which does not include the end-of-line character). The second line (again, not including the end-of-line character) of each pair is a target word. The end of input is marked by end of file.
Output
For each input pair, your program should produce a sorted list of valid sequences ofiandowhich produce the target word from the source word. Each list should be delimited by
[
]
and the sequences should be printed in "dictionary order". Within each sequence, eachiandois followed by a single space and each sequence is terminated by a new line.
Process
A stack is a data storage and retrieval structure permitting two operations:
Push - to insert an item and
Pop - to retrieve the most recently pushed item
We will use the symboli(in) for push ando(out) for pop operations for an initially empty stack of characters. Given an input word, some sequences of push and pop operations are valid in that every character of the word is both pushed and popped, and furthermore, no attempt is ever made to pop the empty stack. For example, if the word FOO is input, then the sequence:
i i o i o o |
is valid, but |
i i o |
is not (it's too short), neither is |
i i o o o i |
(there's an illegal pop of an empty stack) |
Valid sequences yield rearrangements of the letters in an input word. For example, the input word FOO and the sequencei i o i o oproduce the anagram OOF. So also would the sequencei i i o o o. You are to write a program to input pairs of words and output all the valid sequences ofiandowhich will produce the second member of each pair from the first.
Sample Input
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
]
通过栈的进栈、出栈操作描述由第一个源字符串转换到目的字符串。i表示进栈,o表示出栈。输出所有的可能,并且结果按字典顺序排列。anagram意为回文构词法。若源字符串无法转换为目的字符串,则不显示结果。
比如:madam转换为adamm:
m进栈,a进栈,d进栈,a进栈,a出栈,d出栈,a出栈,m进栈,m出栈,m出栈。即显示结果为:i i i i o o o i o o
这只是一种情况,要求显示出所有的情况。结果由一对"["、“]”包住。
通过递归调用过程anagram解决问题。
函数anagram的接口为:
void anagram(char *p_st, int top, char *p_res, int num, int si, int ti);
p_st指向当前的栈,top指向当前入栈位置,即栈顶元素为p_st[top-1]。p_res指向存储结果的字符串,num为下一个结果的位置。si为当前源字符串的搜索位置,ti为当前目的字符串的搜索位置。
源字符串source和目的字符串target为全局变量。
本过程一开始要对栈和结果字符串进行复制,否则无法得到多个结果且会产生混乱。
流程图为:

优先进栈,写入“i”,并递归调用,之后返回后再看是否原栈顶元素是否与当前目的字符串搜索位置匹配,再在合适地方写入“o”,然后递归调用。每一次过程调用先考虑“i”的情况再考虑“o”的情况保证了输出结果按字典排序输出。
基本上此过程有3个主要过程,检验是否产生结果,进栈并处理,出栈并处理。
在Ubuntu下没有找到一个好用的画图工具,于是使用了一个在线绘制流程图的app:Gliffy(http://www.gliffy.com/)。非常不错!
代码(gcc)
分享到:
相关推荐
深度搜索 回溯 int main { string s1 s2; while cin >> s1 >> s2 { count 0; cout << "[" << endl; if s1 length s2 length BackTrake s1 s2 ;... [更多]
标题“ZOJ1014.zip_zoj code_zoj1004”表明这是一个与ZOJ(ZeroJudge)在线判题系统相关的代码压缩包,其中可能包含了解决ZOJ问题1004的源代码。ZOJ是面向编程爱好者和学生的一个在线编程竞赛平台,它提供了各种算法...
zoj_1004.cpp 求单词字母进出栈后能形成目标串的进出方案 广度优先搜索求解
zoj 题库 详细解答 解题代码 该资源主要涵盖了 zoj 题库中的各种编程题目,涵盖了基本算法、数据结构、数学运算等多个方面的知识点。下面是对该资源中出现的知识点的详细解释: 1. 第一次 ACM 总结(7th ACM) 该...
【标签】"ZOJ1002" 作为唯一标签,再次强调了这个压缩包的内容与ZOJ平台上的第1002题紧密相关。在ZOJ上,每个题目都有自己的标签,便于用户搜索和分类。 【压缩包子文件的文件名称列表】仅有一个文件名 "zoj 1002...
【标签】中的关键词进一步确认了内容的主题,包括"acm"(国际大学生程序设计竞赛)、"新手必备"、"浙大"、"解答"、"代码库"、"zoj"和"zju",这些都是与ACM竞赛、浙江大学以及ZOJ平台相关的关键信息。 【压缩包子...
【标签】"zoj 源码 700"是关键词,表明这个资源与ZOJ平台相关,且着重于700个题目源代码的分享,对学习者而言是一个宝贵的参考资料库。 【压缩包子文件的文件名称列表】"zoj 源码700"可能是压缩包内的文件夹名称,...
【ZOJ.zip】是一个压缩包,里面包含了与ZOJ(Zhejiang Online Judge)相关的ACM(International Collegiate Programming Contest)题解。ZOJ是一个在线编程竞赛平台,它为参赛者提供了一系列算法题目进行练习,以...
《ZOJ 4041问题的正确解法与程序分析》 ZOJ(Zhejiang Online Judge)是一个知名的在线编程竞赛平台,其中的题目编号为4041的题目吸引了众多程序员的关注。本篇文章将深入探讨ZOJ 4041的正确解法,并对提供的源代码...
ZOJ(Zhejiang Online Judge)是一个著名的在线编程竞赛平台,主要面向计算机科学与信息技术的学生和爱好者,提供了大量的算法题目供参赛者练习和提交代码。"ZOJ题目答案源码"是一个压缩包文件,其中包含了700多道...
能AC 通过的c++代码,包括zoj1002,1091,1789
标题中的"ZOJ.gz_ ZOJ_ZOJ 1016_max flow_zoj 1045_zoj.rar" 提到了两个ZOJ(Zhejiang Online Judge)的题目,分别是1016和1045,这两个数字通常代表在线编程竞赛中的题目编号。这些题目通常涉及到算法和数据结构的...
浙江大学ZOJ题目分类旨在为编程学习者提供一个系统化的训练平台,帮助他们在算法和编程技能上实现质的飞跃。ZOJ平台提供的分类题目包括但不限于基础算法、数据结构、动态规划以及模拟问题等,这些分类覆盖了计算机...
ZOJ,全称“浙江大学程序在线评测系统”(Zhejiang University Online Judge),是一个提供信息学(算法竞赛)题库及程序评测的网站。以下是关于ZOJ的详细介绍: 一、基本信息 名称:浙江大学程序在线评测系统(ZOJ)...
【标题】"ZOJ1027解题指南"是一个针对特定编程竞赛题目——ZOJ1027的解决方案集合。ZOJ,全称为“Zhejiang Online Judge”,是浙江大学主办的一个在线编程竞赛平台,提供了丰富的算法题目供参赛者练习和挑战。本解题...
ZOJ,全称为Zhejiang Online Judge,是一个知名的在线编程竞赛平台,主要服务于浙江大学和国内其他高校的学生,提供丰富的算法题目供参赛者练习和比赛。这个压缩包文件名为"ZOJ 700多题源代码",意味着它包含了解决...
Problem Arrangement zoj 3777
标题“Zoj 1005我的解答已经AC”表明这是一个关于在线编程竞赛ZOJ(Zhejiang Online Judge)的问题,且提交的解决方案已经通过了所有测试用例(Accepted,简称AC)。ZOJ是一个用于练习和评测算法能力的平台,其中的...
ZOJ(Zhejiang Online Judge)是一个著名的在线编程竞赛平台,尤其在ACM(国际大学生程序设计竞赛)领域中有着广泛的影响力。这个“ZOJ题解集合-截至2835”显然是一份包含了大量ZOJ题目解决方案的压缩包,其中涵盖了...
本题是ZOJ(Zhejiang Online Judge)平台上的1347题,题目名为“Determine the Price”,属于优化问题,需要通过编程解决。问题的核心是找到一个剧院门票的最佳定价策略,以最大化每场演出的总收入。问题涉及到的...