2014-06-17 21:50:29
题意&思路:有n个队伍,并给出每支队伍的成员号码,对于每个ENQUEUE x 命令, 如果x所在的队伍已经在队列中, 则x排在队列中它的队伍的尾巴,否则排在队列的末尾。 每次DEQUEUE命令,把front元素取出并输出来,也就是队中有队了。可以用二维队列来做,我的话用链表来做,相当于模拟了二维队列,有点挫,但理清逻辑还是挺容易理解的。(看做是一串链表,每个节点下面可能还挂着几个节点)
1 #include <cstdio> 2 #include <cstring> 3 #include <string> 4 #include <iostream> 5 using namespace std; 6 7 struct node{ 8 int v; 9 node *right,*hang,*tail; //tail有点特别,指向最后一个元素 10 node(){ 11 right = hang = NULL; 12 tail = this; 13 } 14 }; 15 int team[1000005]; 16 int main(){ 17 int t,Case = 0,tmp,cnt,val; 18 char str[30]; 19 while(scanf("%d",&t) == 1){ 20 if(t == 0) break; 21 node *root = new node; 22 memset(team,0,sizeof(team)); 23 for(int i = 1; i <= t; ++i){ 24 scanf("%d",&cnt); 25 for(int j = 1; j <= cnt; ++j){ 26 scanf("%d",&tmp); 27 team[tmp] = i; 28 } 29 } 30 printf("Scenario #%d\n",++Case); 31 while(scanf("%s",str) == 1){ 32 if(str[0] == 'S') break; 33 if(str[0] == 'E'){ 34 scanf("%d",&val); 35 int flag = 0; 36 node *p = root; 37 node *q = new node; 38 q->v = val; 39 while(p->right != NULL){ 40 if(team[p->right->v] == team[val]){ 41 flag = 1; 42 p->right->tail->hang = q; 43 p->right->tail = q; 44 break; 45 } 46 p = p->right; 47 } 48 if(!flag) 49 p->right = q; 50 } 51 else{ 52 node *p = root; 53 node *q = p->right; 54 printf("%d\n",q->v); 55 if(p->right->hang == NULL) 56 p->right = q->right; 57 else{ 58 q->hang->tail = q->tail; 59 q->hang->right = q->right; 60 p->right = q->hang; 61 } 62 } 63 } 64 puts(""); 65 } 66 return 0; 67 }