列车厢调度(栈)

该博客讨论了列车厢调度问题,这是一个涉及栈操作的数据结构问题。文章提供了问题的详细描述,包括输入和输出格式,并给出了两个示例。作者采用数组模拟操作来解决这个问题,虽然栈通常用于此类型的问题,但作者直接使用数组实现。提醒读者理解并亲自编写代码,以加深对问题的理解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 7-9 列车厢调度 (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?

思路:用数组直接模拟操作,虽然这道题考的是栈操作,但栈是特殊的数组不是吗?之前我看了网上很多的代码用C++stack写的,隔了两周重新写一遍。PTA题给关了,没有实际提交过,可能还有bug 。抄代码可以,但一定要自己弄懂,自己写一遍,没有什么问题是自己写一遍解决不了的,如果有,就是两遍,再有,三遍。

#include<iostream>
#include<cstring>
using namespace std;
int a[50],b[50];
char s1[50],s2[50],s3[50];
int shuchu[50];
int flag=0,temp=0,cnt=0;
int caozuo_1=0,caozuo_2=0;
int main()
{
	int i;
	cin>>s1;
	cin>>s2;
	int length1=strlen(s1);
	int length2=strlen(s2);
	//////////////比较
	for(i=0;i<length1;i++)
	{
		if(s1[i]==s2[cnt])//轨道1上的与轨道2的相等吗? 
		{
			cnt++;//相等的话轨道2移到下一辆去比较 
			caozuo_1++;//1->2这种操作,用拼音证明我英语没过六级哈哈 
			shuchu[flag++]=1;//在输出的数组中记录,方便输出 
		}
		else
		{
			s3[temp++]=s1[i];//如果不匹配放到轨道3中缓存 
			shuchu[flag++]=2;//依然记录 
		}
	}
	//注释的代码都是断言痕迹,嫌丑可以删掉 
	//cout<<s3[0]<<s3[1];
	//cout<<temp<<"++";
	for(i=temp-1;i>=0;i--)//轨道3上的还有机会匹配 
	{
		//cout<<s3[i]<<s2[length1-i-1]<<"{{{";
		if(s3[i]==s2[length1-i-1])//判断作为缓存的3号轨道上是否匹配 
		{
			caozuo_2++;
			shuchu[flag++]=3;
		 } 
	}
	//cout<<caozuo_1<<caozuo_2;
	if(caozuo_1==length1)//根本没用到轨道3就匹配完了 
	{
		int count=0;
	    for(i=0;i<length1;i++)
		{
			if(count++!=0)cout<<"\n";//输出换行用的 
			printf("1->2");
	    }	
	}
	else if(caozuo_1+caozuo_2==length1)//所有列车都匹配才输出,不然就Kidding了 
	{
		int count=0;
		for(i=0;i<flag;i++)
		{
			if(shuchu[i]==1)
			{
				if(count++!=0)cout<<"\n";
				cout<<"1->2";
			}
			if(shuchu[i]==2)
			{
				if(count++!=0)cout<<"\n";
				cout<<"1->3";
			}
			if(shuchu[i]==3)
			{
				if(count++!=0)cout<<"\n";
				cout<<"3->2";
			}
		}
	}
	else cout<<"Are you kidding me?";
	return 0;
 } 

 

### 数据结构课程设计中车厢调度的实现方案与算法设计 在数据结构课程设计中,车厢调度问题是一个典型的综合实践项目。该项目结合了排序、搜索、优先队和图算法等核心概念,旨在提升学生对数据结构的理解以及编程能力[^1]。 #### 1. 数据结构的选择与应用 车厢调度问题需要模拟复杂的铁路系统操作,因此选择合适的数据结构至关重要。例如: - **链表**:用于表示车厢,便于插入和删除操作。 - ****:适用于模拟车厢进出站的操作,尤其是当车厢调度涉及后进先出(LIFO)逻辑时。 - **队**:适合处理先进先出(FIFO)的调度场景,如车厢按顺序进入或离开车站。 - **优先队**:可用于优化调度策略,例如根据车厢优先级安排进出站次序。 - **图结构**:可以建模铁路网络中的路径规划问题,使用最短路径算法(如Dijkstra或A*)优化调度路线。 ```python # 示例代码:使用模拟车厢进出站 class TrainStation: def __init__(self): self.stack = [] def enter_station(self, car_id): self.stack.append(car_id) def leave_station(self): if not self.stack: return None return self.stack.pop() # 测试代码 station = TrainStation() station.enter_station(1) station.enter_station(2) print(station.leave_station()) # 输出: 2 ``` #### 2. 算法设计与递归实现 车厢调度问题可以通过递归方法解决,关键在于理解问题的递归关系并设计合适的递归框架[^2]。例如,假设我们需要将一组车厢按照特定顺序重新排,则可以通过以下步骤实现: - 定义递归基例:当车厢已满足目标顺序时,停止递归。 - 在每一步中,尝试将当前车厢移动到正确位置,并递归处理剩余部分。 ```java // 示例代码:Java实现车厢调度的递归算法 public class CarriageScheduler { public static void schedule(int[] cars, int targetIndex) { if (targetIndex < 0 || targetIndex >= cars.length) { return; } // 将目标车厢移动到正确位置 int temp = cars[targetIndex]; for (int i = targetIndex; i > 0; i--) { cars[i] = cars[i - 1]; } cars[0] = temp; // 递归处理下一个目标车厢 schedule(cars, targetIndex + 1); } public static void main(String[] args) { int[] cars = {4, 3, 2, 1}; schedule(cars, 0); System.out.println(Arrays.toString(cars)); // 输出: [1, 2, 3, 4] } } ``` #### 3. 并发与多线程编程 在实际铁路系统中,车厢调度可能涉及多个并发操作。因此,项目还需要考虑多线程编程技术,确保调度过程的安全性和效率。例如,可以使用Java的`Thread`类或`ExecutorService`来管理多个调度任务。 ```java // 示例代码:使用Java线程模拟多车厢调度 import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class MultiThreadedScheduler { public static void main(String[] args) { ExecutorService executor = Executors.newFixedThreadPool(4); for (int i = 1; i <= 4; i++) { final int carriageId = i; executor.submit(() -> { System.out.println("Carriage " + carriageId + " is being scheduled."); }); } executor.shutdown(); } } ``` #### 4. 系统测试与性能评估 完成调度算法的设计后,需要进行全面的测试以验证其正确性和性能。这包括单元测试、集成测试以及压力测试,确保系统能够在高负载情况下稳定运行。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值