您的位置:首页 > 产品设计 > UI/UE

uva 540 Team Queue (队列模拟)

2013-09-24 19:50 465 查看
很好的一道练习队列的题目。。。。。也是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;
}
/*多个队列模拟。。*/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: