1 / 19

Railkk 解答!

Railkk 解答!. 许细清 030402326. 有限转轨栈车皮排序问题. 问题描述 : 在一个列车调度站中, k 条轨道连接到 k 条侧轨处,形成 k 个铁路转轨栈,从左到右依次记为 H 1 , H 2 , … , H k 如下图所示。. 左边轨道为车皮入口(记为 H0 ),右边轨道为出口(记为 Hk+1 ),编号为的 n 个车皮从入口依次进入转轨栈,由调度室安排车皮进出栈次序,并对车皮按其出栈次序重新排序为 1 , 2 , … , n 。. 调度室在安排车皮进出栈次序时,遵循以下规则:

dominy
Download Presentation

Railkk 解答!

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Railkk解答! 许细清 030402326

  2. 有限转轨栈车皮排序问题 问题描述: 在一个列车调度站中,k条轨道连接到k条侧轨处,形成k个铁路转轨栈,从左到右依次记为H1,H2,…,Hk如下图所示。

  3. 左边轨道为车皮入口(记为H0),右边轨道为出口(记为Hk+1),编号为的n个车皮从入口依次进入转轨栈,由调度室安排车皮进出栈次序,并对车皮按其出栈次序重新排序为1,2,…,n。左边轨道为车皮入口(记为H0),右边轨道为出口(记为Hk+1),编号为的n个车皮从入口依次进入转轨栈,由调度室安排车皮进出栈次序,并对车皮按其出栈次序重新排序为1,2,…,n。

  4. 调度室在安排车皮进出栈次序时,遵循以下规则:调度室在安排车皮进出栈次序时,遵循以下规则: (1)车皮入口H0处的车皮可以进入转轨栈H1,H2,…,Hk之一,或直接进入车皮出口Hk+1。 (2) 转轨栈H1,H2,…,Hk处的车皮可以进入车皮出口Hk+1。

  5. 编程任务: 给定正整数n,和n个车皮的初始编号a1,a2,……an,以及转轨栈数k,编程计算车皮调度方案,使车皮在车皮出口按照1,2,…,n的顺序输出。 数据输入: 由文件input.txt给出输入数据。第1行有2个正整数n和k,表示有n个车皮,k个转轨栈。

  6. 第二行是n个车皮的初始编号a1,a2……an,第3行是k个转轨栈的容量C1,C2,…Ck.第二行是n个车皮的初始编号a1,a2……an,第3行是k个转轨栈的容量C1,C2,…Ck. 结果输出: 将计算出的车皮调度方案输出到文件output.txt。文件的每行是一个形如“a->b”的输出序列。

  7. 其中a和b是转轨栈号,“a->b”表示转轨栈Ha处的车皮进入转轨栈Hb。其中a和b是转轨栈号,“a->b”表示转轨栈Ha处的车皮进入转轨栈Hb。 如果无法实现所要求的调度,输出“No Solution!”。 例如:

  8. 输入文件示例 输出文件示例 input.txt output.txt 9 3 0->1 3 6 9 2 4 7 1 8 5 0->2 2 2 2 0->3 0->1 0->2 0->3 0->4 1->4 1->4 2->4 0->1 0->4 2->4 3->4 1->4 3->4

  9. 算法思想:从H0每来一辆火车,判断是不是正要出去的那辆车,是的话,直接送到H K+1处,并继续判断中转站中有无接下来要出去的车。如果从H0来的这两车不是正要出去的这两车,这要把它送到中转站,送的原则是:先判断已存有火车的中转站,若转轨的TOP比这两车小,则这两车可以压入这个转轨,如果这两车比所有的已存有火车的转轨的TOP都大,则另找个新转轨压入,如果需要的转轨比k大,则No,Solution!

  10. 程序如下: • #include<iostream> • #include<fstream> • #define M 8000 • using namespace std; • class Node • { • friend class Stack ; • private: • int data; • Node *next; • };

  11. class Stack • { • public: • Stack(){top = 0;} • ~Stack(); • bool Empty() const{ return top ==0;} • int Top(); • Stack& Push(int x); • Stack& Pop(); • private: • Node *top; • };

  12. Stack::~Stack () • { • Node * next; • while(top) • { • next=top-> next; • delete top; • top=next; • } • } • int Stack::Top() • { • if(Empty()) return 0; • return top->data ; • }

  13. Stack&Stack::Push (int x) • { • Node *p=new Node; • p->data=x; • p->next=top; • top=p; • return * this; • } • Stack &Stack::Pop () • { • int x; • Node *p=top; • x=top->data; • top=top->next; • delete p; • return * this; • }

  14. int main() • { • ifstream in("input.txt"); • if(in.fail()) • { • cout<<"The input.txt is not existed!"<<endl; • exit(1); • } • ofstream out("output.txt"); • Stack stack[M]; • int entrance[M],exit[M],n,k,Nowout=1,s=0,i=0,j,x,num=1; • in>>n>>k;

  15. while(s++<n) • { • in>>x; • if(x==Nowout) • { • entrance[i]=0; • exit[i++]=k+1; • Nowout++; • for(j=1;j<num&&Nowout<=n;j++) • { • if(stack[j].Top()==Nowout) • { • entrance[i]=j; • exit[i++]=k+1; • stack[j].Pop(); • if(!stack[j].Top ()) • stack[j].Push(n+1); • Nowout++; j=0; • } • } • }

  16. else • { • for(j=1;j<num;j++) • { • if(x<stack[j].Top ()) • { • stack[j].Push(x); • entrance[i]=0; • exit[i++]=j; • break; • } • } • if(j==num) • { • stack[num++].Push(x); • entrance[i]=0; • exit[i++]=j; • } • } • }

  17. while(Nowout<=n) • { • for(j=1;j<num;j++) • { • if(stack[j].Top()==Nowout) • { • entrance[i]=j; • exit[i++]=k+1; • stack[j].Pop(); • Nowout++; • j=1; • } • } • }

  18. if(num>k+1) • out<<"No solution!"<<endl; • else • for(s=0;s<i;s++) • out<<entrance[s]<<"->"<<exit[s]<<endl; • return 0; • }

  19. 谢谢收看!! 下次再来!!

More Related