#ifndef _TRAIN_HPP_
#define _TRAIN_HPP_
#include <time.h>
#include "queue.hpp"
#define JIE 10

class Train
{
private:
    int _v[10];
    Queue<int> come[2];
    Queue<int> temp[4];
    Queue<int> out;

public:
    Train()
    {
        srand(time(NULL));

        for (int i = 0; i < JIE; i++)
            _v[i] = JIE - i;
        for (int i = 0; i < JIE; i++)
            swap(i, rand() % JIE);
        printf("入队序列: \n");
        printf("#1到达轨 ");
        for (int i = 0; i < 5; i++)
        {
            come[0].enqueue(_v[i]);
            printf("%2d ", _v[i]);
        }
        printf("\n");
        printf("#2到达轨 ");
        for (int i = 5; i < 10; i++)
        {
            come[1].enqueue(_v[i]);
            printf("%2d ", _v[i]);
        }
        printf("\n");
    }

    bool orgnize()
    {
        int j = 0;
        while (!come[1].empty() || !come[0].empty())
        {
            for (int i = 0; i < 4;)
            {
                if  (temp[i].back() < 
                    (come[1].front() < come[0].front() ? 
                    (come[1].front() ? come[1].front() : come[0].front()) : 
                    (come[0].front() ? come[0].front() : come[1].front())))
                {
                    printf("%2d号车厢由#%d到达轨推入#%d缓冲轨 \n", 

                    (come[1].front() < come[0].front() ? 
                    (come[1].front() ? come[1].front() : come[0].front()) : 
                    (come[0].front() ? come[0].front() : come[1].front())), 

                    (come[1].front() < come[0].front() ? 
                    (come[1].front() ? 2 : 1) : 
                    (come[0].front() ? 1 : 2)),

                     i + 1);


                    temp[i].enqueue(
                    (come[1].front() < come[0].front() ? 
                    (come[1].front() ? come[1].dequeue() : come[0].dequeue()) : 
                    (come[0].front() ? come[0].dequeue() : come[1].dequeue())));
                }
                else
                {
                    j++;
                    i++;
                    if (j > 40)
                        return false;
                }
            }
        }
        return true;
    }
    int Out()
    {
        for (int i = 1; i <= JIE;)
        {
            for (int j = 0; j < 4; j++)
            {
                if (temp[j].front() == i)
                {
                    printf("%2d号车厢经#%d缓冲轨推入出发区，出发队列为 ", temp[j].front(), j + 1);
                    out.enqueue(temp[j].dequeue());
                    for (int i = 0; i < out.size(); i++)
                        printf("%d ", out[i]);
                    printf("\n");

                    i++;
                }
            }
        }
        return 0;
    }

protected:
    void swap(int a, int b)
    {
        int temp = _v[a];
        _v[a] = _v[b];
        _v[b] = temp;
    }
};
#endif
