企业网站首页设计,企业网站的开发与应用,网站建设教程 湖南岚鸿,潍坊网站建设团队7-5 列车厢调度 (25 分) 1 --移动方向/ 3 \2 --移动方向大家或许在某些数据结构教材上见到过“列车厢调度问题”#xff08;当然没见过也不要紧#xff09;。今天#xff0c;我们就来实际操作一下列车厢的调度。对照上方的ASCII字符图#xff0c…7-5 列车厢调度 (25 分) 1 --移动方向/ 3 \2 --移动方向大家或许在某些数据结构教材上见到过“列车厢调度问题”当然没见过也不要紧。今天我们就来实际操作一下列车厢的调度。对照上方的ASCII字符图问题描述如下
有三条平行的列车轨道1、2、3以及1-3和2-3两段连接轨道。现有一列车厢停在1号轨道上请利用两条连接轨道以及3号轨道将车厢按照要求的顺序转移到2号轨道。规则是
每次转移1节车厢 处在1号轨道的车厢要么经过1-3连接道进入3号轨道该操作记为1-3要么经过两条连接轨道直接进入2号轨道该操作记为1-2 一旦车厢进入2号轨道就不可以再移出该轨道 处在3号轨道的车厢只能经过2-3连接道进入2号轨道该操作记为3-2 显然任何车厢不能穿过、跨越或绕过其它车厢进行移动。 对于给定的1号停车顺序如果经过调度能够实现2号轨道要求的顺序则给出操作序列如果不能就反问用户 Are(你) you(是) kidding(凯丁) me(么)?
输入格式: 两行由大写字母组成的非空字符串第一行表示停在1号轨道上的车厢从左到右的顺序第二行表示要求车厢停到2号轨道的进道顺序输入样例1中第二行CBA表示车厢在2号轨道的停放从左到右是ABC因为C最先进入所以在最右边。两行字符串长度相同且不超过26因为只有26个大写字母每个字母表示一节车厢。题目保证同一行内的字母不重复且两行的字母集相同。
输出格式: 如果能够成功调度给出最短的操作序列每个操作占一行。所谓“最短”即如果1-2可以完成的调度就不要通过1-3和3-2来实现。如果不能调度输出 “Are you kidding me?”
输入样例1:
ABC CBA 输出样例1: 1-3 1-3 1-2 3-2 3-2 输入样例2: ABC CAB 输出样例2: Are you kidding me?
#include bits/stdc.h
using namespace std;
int main()
{int i0,flag0;stackchara,b;char st[100],re[100];while ((st[i]getchar())!\n){i;}st[i]\0;for (int istrlen(st)-1;i0;i--){a.push(st[i]);}i0;while ((re[i]getchar())!\n){i;}re[i]\0;int k0;while (k!strlen(re)){if (!a.empty()a.top()!re[k]) //移入3暂存 {b.push(a.top());a.pop();}else if (!a.empty()a.top()re[k]) //直接移入2 {a.pop();k;}while (!b.empty()b.top()re[k]) //从暂存中提取 {b.pop();k;}if (a.empty()!b.empty()b.top()!re[k]){break;}}if (kstrlen(re)){flag1;}while (!a.empty()) a.pop();while (!b.empty()) b.pop();k0;for (int istrlen(st)-1;i0;i--){a.push(st[i]);}
// flag1;if (flag0){printf(Are you kidding me?\n);return 0;}if (flag1){while (kstrlen(re)){while (!b.empty()b.top()re[k]) //从暂存中提取 {printf(3-2\n);b.pop();k;}if (!a.empty()a.top()re[k]) //直接移入2 {printf(1-2\n);a.pop();k;}else if (!a.empty()a.top()!re[k]) //移入3暂存 {printf(1-3\n);b.push(a.top());a.pop();}if (a.empty()!b.empty()b.top()!re[k]){break;}}}return 0;
}坑点在对比1栈起始轨道和re数组目标轨道时遇到相同的就移到目标轨道否则移入3栈暂存当从1栈开始移动时只有两个选择
移动到2栈即目标栈移动到3栈即暂存栈
当暂存栈符合re数组的要求时一定要用while循环任意类型循环都行只需要控制好条件将所有符合的字符全部pop出来不然很可能出现遗漏问题测试点2例如 ABCDEF CDBAEF 左侧为正确答案