- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
火车车厢重排问题
1.1 火车车厢重排问题
一列货运列车共有n节车厢,每节车厢将停放在不同的车站。假定n个车站的编号分别为1~n,货运列车按照第n站至第1站的顺序经过这些车站。车厢编号与他们的目的地一样。为了便于从列车上卸掉相应的车厢,必须重排车厢顺序,使得各车厢从前往后按编号1到n的次序排列。当所有车厢按照这种次序排列时,在每个车站只需卸掉最后一个车厢即可。
1.2想法
一列火车的每个车厢按顺序从入轨进入不同缓冲轨,缓冲轨重排后的进入出轨,重新编排成一列货车。比如:编号为3的车厢进入缓冲轨1,则下一个编号小于3的车厢则必须进入下一个缓冲轨2,而编号大于3的车厢则进入缓冲轨1,排在3号车厢的后面,这样,出轨的时候才可以按照从小到大的顺序重新编排
我们在一个转轨站里完成重拍的工作,在转轨站有一个入轨,一个出轨和k个缓冲轨(位于入轨和出轨之间)。??面的图示就是一个转轨站,其中有3个缓冲轨,H1,H2,H3。(PPT中有动态演示)
1.3算法描述:
为了重排车厢,需从前往后依次检查入轨上的所有车厢。如果正在检查的车厢就是下一个满足要求的车厢,可以直接把它放到出轨上。否则,则把它移动到缓冲轨上,直到按输出顺序要求轮到它的时候才可以将他放到出轨上。缓冲轨是按照FILO的方式使用的,因为车厢的进出都是在缓冲轨的顶端进行的。
在重排车厢过程中,仅允许以下活动:
车厢可以从一个缓冲轨的顶部移动到出轨的左端
有空的缓冲轨可以优先放。
没空的缓冲轨时,要将新的车厢放在顶部车厢编号比新车厢的编号大的所有缓冲轨中选择顶部车厢编号最小的那个
车厢可以从入轨的前部移动到一个缓冲轨的顶部或者是出轨的左端
如果缓冲站的结构如下所示:
那么缓冲轨就不是FILO 而是FIFO了 那么就要用队列来实现车厢重排了,算法的描述和栈实现的基本一样的,只是OutPut 和 Hold 函数改了一下,将一截车厢移动到缓冲轨时,车厢c应该移动到这样的缓冲轨中:该缓冲轨中现有各车厢的编号均小于c,如果有多个缓冲轨都满足这一条件,那么选择其中左端车厢编号最大的那个缓冲轨,否则选择一个空的缓冲轨(如果存在的话)
1.4代码:
#include iostream
#include stack
using namespace std;
template class T
void PrintfNum(T a[], const int n);
// move cars from holding track to output track
void OutPut(stackint t[],int n, int totalStack,int min){
//move car from holding track
for(int x = 0;x totalStack; ++x){
if(!t[x].empty() t[x].top() == min){
cout Move car t[x].top() from holding track x to output endl;
t[x].pop();
++min;
x = -1; // find next car from the first holding track 0
}
}
}
// move cars from input track to holding track
bool Hold(stackint t[],int n , int totalStack){
for(int i = 0;i totalStack; ++i){
if(t[i].empty() || (!t[i].empty() t[i].top() n)){
cout holding track i hold car n endl;
t[i].push(n);
return true; // we already find a holding track, so break the loop.
}
文档评论(0)