列车箱调度

实验二
------------------一、列车箱调度
[1] 实验内容
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?”

[2] 实验目的
(1) 深入了解栈和队列的特性,掌握栈和队列的存储方法。
(2) 掌握栈和队列的基本操作,如初始化、入栈(队列)、出栈(队列)等,并能在实际问题背景下灵活运用。
[3] 程序清单
https://blog.csdn.net/GERMANYozil/article/details/97142445

1.	#include<iostream>  
2.	#include<stack>  
3.	#include<cstring>  
4.	#include<bits/stdc++.h>  
5.	#include<stdio.h>  
6.	  
7.	using namespace std;  
8.	  
9.	const int MAXN = 30;  
10.	  
11.	int main(){  
12.	    stack<char>s1, s2, s3;//三个栈分别表示轨道1、2、3   
13.	      
14.	    int arr[MAXN];//arr[]存放每次调度的方式,即1->2, 1->3, 3->2三种   
15.	    char a[MAXN], b[MAXN];//a[]表示停在1轨道上的车厢,b[]表示要在2轨道上的顺序   
16.	//  string a, b;  
17.	    cin >> a >> b;  
18.	//  gets(a);  
19.	//  gets(b);  
20.	//  int lena = a.length();  
21.	//  int lenb = b.length();  
22.	    int lena = strlen(a);  
23.	    int lenb = strlen(b);  
24.	    for(int i = lena - 1; i >= 0; i--){//将a[]压栈   
25.	        s1.push(a[i]);  
26.	    }  
27.	    for(int i = lenb - 1; i >= 0; i--){//将b[]压栈   
28.	        s2.push(b[i]);  
29.	    }  
30.	    bool flag = 0;//flag标记 记录是否可以通过   
31.	    int k = 0;//k来车厢记录调度的次数   
32.	    while(!s2.empty()){//调度的结束标志时栈s2为空   
33.	        if(!s1.empty() && s1.top() == s2.top()){  
34.	            //如果s1 和 s2 栈顶元素相同,代表是同一节车厢,那就都出栈,表明当前顺序是对的,直接1->2 。   
35.	            s1.pop();  
36.	            s2.pop();  
37.	            arr[k++] = 1;//1->2  
38.	        }  
39.	        else if(!s3.empty() && s3.top() == s2.top()){  
40.	            // 如果s3 和 s2 栈顶元素相同, 代表车厢到3轨道中转一下, 现在可以同时出出栈。即3->2   
41.	            s3.pop();  
42.	            s2.pop();  
43.	            arr[k++] = 3;//3->2  
44.	        }   
45.	        else if(s1.empty() && !s2.empty() && s3.top() != s2.top()){  
46.	            // 如果栈s1已经空了, s2还没空, 并且s3 和 s2 栈顶元素不相同, 那就表示车厢没有办法仅通过s3来调度,将flag标记为1,然后跳出循环。   
47.	            flag = 1;  
48.	            break;  
49.	        }  
50.	        else{  
51.	            //其他都需要通过s3 来中转一下, 即将s1的栈顶元素压入s3中,然后s1栈顶元素出栈。即1->3   
52.	         s3.push(s1.top());  
53.	         s1.pop();  
54.	         arr[k++] = 2;//1->3  
55.	        }     
56.	    }  
57.	    if(flag){//flag 为1 ,无法调度,输出Kidding me   
58.	        cout << "Are you kidding me?" <<endl;  
59.	    }  
60.	    else{// flag 为0, 可以调度, 输出arr[]中所代表的调度方式。   
61.	        for(int i = 0; i < k; i++){  
62.	            if(arr[i] == 1) cout << "1->2" <<endl;  
63.	            else if(arr[i] == 2) cout << "1->3" <<endl;  
64.	            else if(arr[i] == 3) cout << "3->2" <<endl;   
65.	        }  
66.	    }  
67.	    return 0;  
68.	}   

[4] 调试步骤
输出格式的调试
[5] 运行结果
输入样例1:
ABC
CBA
输出样例1:
1->3
1->3
1->2
3->2
3->2
输入样例2:
ABC
CAB
输出样例2:
Are you kidding me?
测试数据
名称 分数 提示 更新时间
0 10 sample1等价,完全逆序
1 5 sample2等价,最后一个最先出现,其他乱序
2 5 最长序列,一般情况,可行
3 3 最长序列,一般情况,不可行
4 2 最短序列
[6] 分析与思考
输出格式,行末没有空格,一开始输出时候行末带有空格,之后发i谢娜之后,就先输出前n-1个结点(每个结点之后都有空格),然后再输出最后一个结点即n即可。
#二、银行排队问题之单队列多窗口服务
###[1] 实验内容
假设银行有K个窗口提供服务,窗口前设一条黄线,所有顾客按到达时间在黄线后排成一条长龙。当有窗口空闲时,下一位顾客即去该窗口处理事务。当有多个窗口可选择时,假设顾客总是选择编号最小的窗口。
本题要求输出前来等待服务的N位顾客的平均等待时间、最长等待时间、最后完成时间,并且统计每个窗口服务了多少名顾客。
输入格式:
输入第1行给出正整数N(≤1000),为顾客总人数;随后N行,每行给出一位顾客的到达时间T和事务处理时间P,并且假设输入数据已经按到达时间先后排好了顺序;最后一行给出正整数K(≤10),为开设的营业窗口数。这里假设每位顾客事务被处理的最长时间为60分钟。
输出格式:
在第一行中输出平均等待时间(输出到小数点后1位)、最长等待时间、最后完成时间,之间用1个空格分隔,行末不能有多余空格。
在第二行中按编号递增顺序输出每个窗口服务了多少名顾客,数字之间用1个空格分隔,行末不能有多余空格。

###[2] 实验目的
(3) 深入了解栈和队列的特性,掌握栈和队列的存储方法。
(4) 掌握栈和队列的基本操作,如初始化、入栈(队列)、出栈(队列)等,并能在实际问题背景下灵活运用。

[3] 程序清单

https://paste.ubuntu.com/p/qWSwk2vyC8/

[4] 调试步骤

输出格式的调试

###[5] 运行结果
输入样例:
9
0 20
1 15
1 61
2 10
10 5
10 3
30 18
31 25
31 2
3
输出样例:
6.2 17 61
5 3 1
测试数据
名称 分数 提示 更新时间
0 13 sample等价,有同时到,有窗口空等待,有超过60分钟的处理
1 2 窗口数比顾客数多
2 2 到达时间密集,每次空窗口都有顾客等待
3 2 刚好全部空窗时有人来,应选最小号窗
4 3 最小规模数据
5 3 最大规模数据

[6] 分析与思考

输出格式,行末没有空格,一开始输出时候行末带有空格,之后发i谢娜之后,就先输出前n-1个结点(每个结点之后都有空格),然后再输出最后一个结点即n即可。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值