uva 540 Team Queue (队列模拟)

来源:互联网 发布:淘宝专家贷款在哪里 编辑:程序博客网 时间:2024/05/17 02:06

很好的一道练习队列的题目。。。。。也是wrong了好几次才发现自己code的BUG。

就是一个简单的排队打饭问题。

不断的入队出队,重要的是维护好队列里元素的相对位置。

最多1000个队列同时维护。。。。好像用链表或者是list容器来维护空间上会好一点。。。

具体实现看代码

#include<cstdio>#include<iostream>#include<string>#include<cstring>using namespace std;const int Maxsize = 1010;int data[Maxsize][Maxsize];/*存储输入数据*/int front_q[Maxsize],rear[Maxsize];/*维护每个队列时的头尾指针*/int arry[Maxsize];/*每小队人的数量。。还是来维护数据输入的*/int team[Maxsize][Maxsize];/*队列*/int Index[Maxsize];/*记录小队间在队列中的前后位置*/bool vis[Maxsize];/*当前小队已经入队的标记*/int cnt;/*队列中小队的数量*/int main(){#ifdef LOCAL    freopen("in.txt","r",stdin);    freopen("out.txt","w",stdout);#endif    int n;    int kkk = 1;    while(cin>>n && n)    {        cnt = 0;        bool aaa = false;        memset(data,0,sizeof(data));        memset(arry,0,sizeof(data));        memset(vis,false,sizeof(vis));        memset(front_q,0,sizeof(front_q));        memset(rear,0,sizeof(rear));        memset(team,-1,sizeof(team));        memset(Index,0,sizeof(Index));        for(int i = 0 ; i < n ; i++)        {            cin>>arry[i];            for(int j = 0 ; j < arry[i] ; j++)            {                cin>>data[i][j];            }        }        string operat;        while(cin>>operat && operat != "STOP")        {            if(operat == "ENQUEUE")            {                int k;                cin>>k;                bool flag = false;                if(cnt == 0)/*队列空,第一个小队入队*/                {                    for(int i = 0 ; i < n ; i++)                    {                        for(int j = 0 ; j < arry[i] ; j++)                        {                            if(k == data[i][j])                            {                                flag = true;                                team[cnt][rear[cnt]++] = k;                                Index[cnt++] = i;                                vis[i] = true;                                break;                            }                        }                        if(flag)                        {                            break;                        }                    }                }                else/*当前元素的小队已经入队*/                {                    for(int i = 0 ; i < cnt ; i++)                    {                        for(int j = 0 ; j < arry[Index[i]] ; j++)                        {                            if(k == data[Index[i]][j] && Index[i] != -1)                            {                                flag = true;                                team[i][rear[i]++] = k;                                break;                            }                        }                        if(flag)                        {                            break;                        }                    }                    if(!flag)/*小队元素没有入队时,该元素作为第一个代表小队入队*/                    {                        for(int i = 0 ; i < n ; i++)                        {                            if(!vis[i])                            {                                for(int j = 0 ; j < arry[i] ; j++)                                {                                    if(k == data[i][j])                                    {                                        flag = true;                                        vis[i] = true;                                        team[cnt][rear[cnt]++] = k;                                        Index[cnt++] = i;                                    }                                }                            }                        }                    }                }            }            else if(operat == "DEQUEUE")            {                if(!aaa)                {                    printf("Scenario #%d\n",kkk++);                    aaa = true;                }                for(int i = 0 ; i < cnt ; i++)                {                    if(Index[i] != -1)                    {                        if(front_q[i] < rear[i])                        {                            cout<<team[i][front_q[i]]<<endl;                            front_q[i]++;                            if(front_q[i] == rear[i])                            {                                vis[Index[i]] = false;                                Index[i] = -1;/*队列一直向后延伸的特性*/                            }                            break;                        }                    }                }            }        }        cout<<endl;    }    return 0;}/*多个队列模拟。。*/


原创粉丝点击