列车车厢重排问题

列车车厢重排就是有一个条铁轨,铁轨有入口和出口,入口和出口之间有三个3个缓冲轨道,缓冲轨道以栈的形式运行,一列货车上有若干个车厢,但是他们的编号是杂乱的,我们想通过这个转轨站,将列车的编号进行重新排列。

arrayStack<int> *track;
int numberOfCars;//轨道缓冲数组
int smallestCar;
int numberOfTracks;//在缓冲轨道中编号最小的车厢
int itsTrack;//停靠着最小编号的缓冲轨道的轨道

bool railroad(int inputOrder[],int theNumberOfCars,int theNumberOfTracks)
{
    numberOfCars=theNumberOfCars;
    numberOfTracks=theNumberOfTracks;

    track=new arrayStack<int>[numberOfTracks+1];
    int nextCarToOutput=1;
    smallestCar=numberOfCars+1;

    for(int i=1;i<numberOfCars;i++)
        if(inputOrder[i]==nextCarToOutput)
        {
            cout<<"Move car"<<inputOrder[i]<<"from input track to output track"<<endl;
            nextCarToOutput++;
            while(smallestCar==nextCarToOutput)
            {
                outputFromHoldingTrack();
                nextCarToOutput++;
            }
        }
        else
            if(!putInHoldingTrack(inputOrder[i]))
                return false;
        return true;
}

主程序,当入口编号刚好满足要求则直接输出到出口,否则入栈,然后判断栈顶元素是否满足要求,
满足则出栈。

void outputFromHoldingTrack()
{
    track[itsTrack].pop();
    cout<<"Move car"<<smallestCar<<"from holding"<<"track"<<itsTrack<<"to output track"<<endl;
    //将最小的那个车编号的车从栈中删除
    smallestCar=numberOfCars+2;//这里使用了一个套路,就是首先将最小值设为超越最大值,然后用寻找到的最小值取一个个代替它。
    for(int i=1;i<=numberOfTracks;i++)//检查每个栈顶的元素,并发现其中最小的的编号和其所属的栈。
        if(!track[i].empty()&&(track[i].top()<smallestCar))
        {
            smallestCar=track[i].top();
            itsTrack=i;
        }
}

这个程序用来将最小栈顶元素输出到出口

bool putInHoldingTrack(int c)
{//将车厢c移动到一个缓冲轨道。返回false,当且仅当没有可用的缓冲轨道
//为车厢c寻找最合适的缓冲轨道
//初始化
int bestTrack=0,bestTop=numberOfCars+1;//同样的寻找最小值的套路
//扫描缓冲轨道
for(int i=1;i<=numberOfTracks;i++)
    //下面这个if寻找最好的栈进行压入
    if(!track[i].empty())//如果栈非空
    {
        int topCar=track[i].top();//获取栈顶元素
        if(c<topCar&&topCar<bestTop)//只有当该栈顶元素为所有栈顶元素中最小的那一个,且c小于该栈顶元素才将c压入该栈。
        {
            bestTop=topCar;
            bestTrack=i;
        }
    }
    else
        if(bestTrack==0) bestTrack=i;
    if(bestTrack==0) return false;
    track[bestTrack].push(c);
    cout<<"Move car"<<c<<"from input track"<<"to holding track"<<bestTrack<<endl;

    if(c<smallestCar)//将c压入栈顶后,更新smallestCar和itsTrack.
    {
        smallestCar=c;
        itsTrack=bestTrack;
    }
    return true;
}

当入口来了一个车厢,如果该车厢不能直接移到出口,那么就将其压入栈中,这个程序用于寻找适当的栈
进行压入,合适的栈的要求,栈顶元素最小,且新入栈的元素要小于这个栈顶元素。

猜你喜欢

转载自blog.csdn.net/du_shuang/article/details/81145036