190 likes | 310 Views
Railkk 解答!. 许细清 030402326. 有限转轨栈车皮排序问题. 问题描述 : 在一个列车调度站中, k 条轨道连接到 k 条侧轨处,形成 k 个铁路转轨栈,从左到右依次记为 H 1 , H 2 , … , H k 如下图所示。. 左边轨道为车皮入口(记为 H0 ),右边轨道为出口(记为 Hk+1 ),编号为的 n 个车皮从入口依次进入转轨栈,由调度室安排车皮进出栈次序,并对车皮按其出栈次序重新排序为 1 , 2 , … , n 。. 调度室在安排车皮进出栈次序时,遵循以下规则:
E N D
Railkk解答! 许细清 030402326
有限转轨栈车皮排序问题 问题描述: 在一个列车调度站中,k条轨道连接到k条侧轨处,形成k个铁路转轨栈,从左到右依次记为H1,H2,…,Hk如下图所示。
左边轨道为车皮入口(记为H0),右边轨道为出口(记为Hk+1),编号为的n个车皮从入口依次进入转轨栈,由调度室安排车皮进出栈次序,并对车皮按其出栈次序重新排序为1,2,…,n。左边轨道为车皮入口(记为H0),右边轨道为出口(记为Hk+1),编号为的n个车皮从入口依次进入转轨栈,由调度室安排车皮进出栈次序,并对车皮按其出栈次序重新排序为1,2,…,n。
调度室在安排车皮进出栈次序时,遵循以下规则:调度室在安排车皮进出栈次序时,遵循以下规则: (1)车皮入口H0处的车皮可以进入转轨栈H1,H2,…,Hk之一,或直接进入车皮出口Hk+1。 (2) 转轨栈H1,H2,…,Hk处的车皮可以进入车皮出口Hk+1。
编程任务: 给定正整数n,和n个车皮的初始编号a1,a2,……an,以及转轨栈数k,编程计算车皮调度方案,使车皮在车皮出口按照1,2,…,n的顺序输出。 数据输入: 由文件input.txt给出输入数据。第1行有2个正整数n和k,表示有n个车皮,k个转轨栈。
第二行是n个车皮的初始编号a1,a2……an,第3行是k个转轨栈的容量C1,C2,…Ck.第二行是n个车皮的初始编号a1,a2……an,第3行是k个转轨栈的容量C1,C2,…Ck. 结果输出: 将计算出的车皮调度方案输出到文件output.txt。文件的每行是一个形如“a->b”的输出序列。
其中a和b是转轨栈号,“a->b”表示转轨栈Ha处的车皮进入转轨栈Hb。其中a和b是转轨栈号,“a->b”表示转轨栈Ha处的车皮进入转轨栈Hb。 如果无法实现所要求的调度,输出“No Solution!”。 例如:
输入文件示例 输出文件示例 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
算法思想:从H0每来一辆火车,判断是不是正要出去的那辆车,是的话,直接送到H K+1处,并继续判断中转站中有无接下来要出去的车。如果从H0来的这两车不是正要出去的这两车,这要把它送到中转站,送的原则是:先判断已存有火车的中转站,若转轨的TOP比这两车小,则这两车可以压入这个转轨,如果这两车比所有的已存有火车的转轨的TOP都大,则另找个新转轨压入,如果需要的转轨比k大,则No,Solution!
程序如下: • #include<iostream> • #include<fstream> • #define M 8000 • using namespace std; • class Node • { • friend class Stack ; • private: • int data; • Node *next; • };
class Stack • { • public: • Stack(){top = 0;} • ~Stack(); • bool Empty() const{ return top ==0;} • int Top(); • Stack& Push(int x); • Stack& Pop(); • private: • Node *top; • };
Stack::~Stack () • { • Node * next; • while(top) • { • next=top-> next; • delete top; • top=next; • } • } • int Stack::Top() • { • if(Empty()) return 0; • return top->data ; • }
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; • }
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;
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; • } • } • }
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; • } • } • }
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; • } • } • }
if(num>k+1) • out<<"No solution!"<<endl; • else • for(s=0;s<i;s++) • out<<entrance[s]<<"->"<<exit[s]<<endl; • return 0; • }
谢谢收看!! 下次再来!!