检查了好久,对拍也跑了好多次,没查出什么问题,输出格式也是正确的,就是答案错了
#include <bits/stdc++.h>
typedef struct QUEUE
{
int data[1002]; //队列数据
int front, rear; //队首、队尾
}Queue;
void initqueue(Queue &q){ //初始化队首和队尾
q.front = 0;
q.rear = 0;
}
void pushup(Queue &q, int num){ //元素入队
q.rear %= 1001;
q.data[q.rear++] = num; //元素入队,在尾部添加
}
int pop(Queue &q){ //元素出队
q.front %= 1001;
return q.data[q.front++]; //返回队首的元素,并且队首++
}
int empty(Queue q){ //检测队列是否为空
return (q.front == q.rear); //若队首队尾指向同一处,说明该队列为空
}
Queue team[1002]; //以人员编号为元素的队列
int k,n,num,count = 0,f[1000001];
//team为队伍数,n为队伍中的人数,k用于读取每个人的编号
//count记录第几组提问,f[i]得到编号为i的人所在的队伍
int main(){
Queue q; //以队伍编号为元素的队列
while (scanf("%d",&num), num){ //读取某组提问中队伍数,0表示结束
initqueue(q); //初始化记录队伍的队列
if (count != 0)
printf("\n\n");
printf("Scenario #%d",++count);
for (int i=1; i<=num; i++){ //读取队伍人员编号
initqueue(team[i]); //初始化记录每个队伍的人员的队列
scanf("%d",&n); //读取人数
for (int j=0; j<n; j++){
scanf("%d",&k); //读取编号
f[k] = i; //f存储每个人的队伍,队伍编号从0开始
}
}
char order[20]; //记录指令
int who,which; //who表示要操作的人的编号,which为这个人所在的队伍
while (scanf("%s",order), order[0] != 'S'){ //只要不是“STOP”,继续操作
if (order[0] == 'E'){ //入队
scanf("%d",&who); //操作对象
which = f[who]; //对象所在队伍
if (empty(team[which])) //没有队友,排到末尾
pushup(q, which); //记录队伍的队列入队
pushup(team[which], who); //进入队伍中
}
else if (order[0] == 'D'){ //出队
if (empty(q)) //空队列时不出队
continue;
which = q.data[q.front]; //哪个队伍
who = pop(team[which]); //这个队伍中的第一个即将出队
if (empty(team[which])) //出队后空了
pop(q); //记录队伍的队列就要出队
printf("\n%d",who); //输出刚才出队的人的编号
}
}
}
return 0;
}