火车重排问题_第1页
火车重排问题_第2页
火车重排问题_第3页
火车重排问题_第4页
火车重排问题_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、火车车厢重排问题1.1 火车车厢重排问题一列货运列车共有n节车厢,每节车厢将停放在不同的车站。假定n个车站的编号分别为1n,货运列车按照第n站至第1站的顺序经过这些车站。车厢编号与他们的目的地一样。为了便于从列车上卸掉相应的车厢,必须重排车厢顺序,使得各车厢从前往后按编号1到n的次序排列。当所有车厢按照这种次序排列时,在每个车站只需卸掉最后一个车厢即可。1.2想法一列火车的每个车厢按顺序从入轨进入不同缓冲轨,缓冲轨重排后的进入出轨,重新编排成一列货车。比如:编号为3的车厢进入缓冲轨1,则下一个编号小于3的车厢则必须进入下一个缓冲轨2,而编号大于3的车厢则进入缓冲轨1,排在3号车厢的后面,这样,

2、出轨的时候才可以按照从小到大的顺序重新编排我们在一个转轨站里完成重拍的工作,在转轨站有一个入轨,一个出轨和k个缓冲轨(位于入轨和出轨之间)。下面的图示就是一个转轨站,其中有3个缓冲轨,H1,H2,H3。(PPT中有动态演示)1.3算法描述:为了重排车厢,需从前往后依次检查入轨上的所有车厢。如果正在检查的车厢就是下一个满足要求的车厢,可以直接把它放到出轨上。否则,则把它移动到缓冲轨上,直到按输出顺序要求轮到它的时候才可以将他放到出轨上。缓冲轨是按照FILO的方式使用的,因为车厢的进出都是在缓冲轨的顶端进行的。在重排车厢过程中,仅允许以下活动:1、 车厢可以从一个缓冲轨的顶部移动到出轨的左端2、

3、有空的缓冲轨可以优先放。3、 没空的缓冲轨时,要将新的车厢放在顶部车厢编号比新车厢的编号大的所有缓冲轨中选择顶部车厢编号最小的那个4、 车厢可以从入轨的前部移动到一个缓冲轨的顶部或者是出轨的左端如果缓冲站的结构如下所示:那么缓冲轨就不是FILO 而是FIFO了 那么就要用队列来实现车厢重排了,算法的描述和栈实现的基本一样的,只是OutPut 和 Hold 函数改了一下,将一截车厢移动到缓冲轨时,车厢c应该移动到这样的缓冲轨中:该缓冲轨中现有各车厢的编号均小于c,如果有多个缓冲轨都满足这一条件,那么选择其中左端车厢编号最大的那个缓冲轨,否则选择一个空的缓冲轨(如果存在的话)1.4代码:#incl

4、ude <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(stack<int> t,int n, int totalStack,int& min) /move car from holding track for(int x = 0;x < totalS

5、tack; +x) if(!tx.empty() && tx.top() = min) cout << "Move car " << tx.top() << " from holding track " << x << " to output" << endl; tx.pop(); +min; x = -1; / find next car from the first holding track 0 / move cars from input

6、track to holding track bool Hold(stack<int> t,int n , int totalStack) for(int i = 0;i < totalStack; +i) if(ti.empty() | (!ti.empty() && ti.top() > n) cout << "holding track " << i << " hold car " << n << endl; ti.push(n); return t

7、rue; / we already find a holding track, so break the loop. return false; int main(int argc, char* argv) const int NUM = 9; const int STACKNUM = 3; stack<int> tSTACKNUM; int min = 1; int aNUM = 5,8,1,7,4,2,9,6,3; PrintfNum(a,NUM); for(int i = NUM - 1; i >= 0; -i) if(ai = min)/ try to move ca

8、rs from input track or holding track cout << "Move car " << ai << " from input to output" << endl; +min; OutPut(t,ai,STACKNUM,min); else/ move cars from input track to holding track if(!Hold(t,ai,STACKNUM) cout << "Not enough holding track"

9、 << endl; break; getchar(); return 0; template <class T> void PrintfNum(T a, const int & n) for(int i = 0; i < n; +i) cout << ai << "," cout << endl; 1.5火车车厢重排问题决策过程369247185 H1 H2 H3 1.5.1初始数组581742963H1 H2 H31.5.2581742936 H1 H2 H3581742 369H1 H2 H3396258174 H1 H2 H3693245817H1 H2 H3 5813692

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论