csu 1898: 复盘拉火车

1898: 复盘拉火车

        Time Limit: 1 Sec     Memory Limit: 128 Mb     Submitted: 114     Solved: 36    


Description

小GJ和小XS没事做用扑克牌玩起了小时候的拉火车游戏。规则如下,GJ和XS交替依次把手中的牌放到桌面上,由于GJ年长,所以他总是先放。桌面上会构成一个新的序列,当这个序列中新放入的点数与以前存在的某个点数重复的时候,这两张重复的牌和中间的牌就依次全部放回所放牌一方的序列尾部。 例如桌面上有牌A 10 2 3 5此时GJ放下一张2则桌面上剩下A 10而2 3 5 2这个序列放到GJ原本手中牌序列的尾部。

Input

有T(T<=20)组数据。 每组第一行给出GJ目前手中牌的数量N1(N1<=100)和这个手牌序列的点数各是多少 (点数可能为 A 2 3 4 5 6 7 8 9 10 J Q K) 第二行给出XS目前手中牌的数量N2(N2<=100)和这个手牌序列的点数各是多少 第三行给出一个数字K,问进行K(K<=2xN1 且 K<=2xN2)次放牌后,桌面上的序列和两个人的手牌序列是怎样的。

Output

每组数据给出3行输出,桌面上的扑克序列,小GJ的手牌序列和小XS的手牌序列。具体格式见样例。 每组数据后加空行间隔。

Sample Input

2
10 A 2 3 4 5 6 7 8 9 10
5 2 2 3 4 5
5
5 2 2 2 2 5
5 A 3 4 J K
10

Sample Output

Deck: A 2 3
GJ: 4 5 6 7 8 9 10 2 2
XS: 3 4 5

Deck: 3 J 5 K
GJ: 2 A 2 2 4 2
XS:

Hint

Source

中南大学第十一届大学生程序设计竞赛

Author

OTTFF

 

 

题解:完完全全的模拟题

  1 #include<iostream>
  2 #include<string>
  3 #include<cstdio>
  4 #include<stack>
  5 #include<map>
  6 #include<algorithm>
  7 using namespace std;
  8 char a[5000],b[5000],c[500];
  9 map<char,int>mp;
 10 int main()
 11 {
 12 
 13     int n;
 14     scanf("%d",&n);
 15     int num1,num2,k;
 16     int r1,r2,r3;
 17     while(n--)
 18     {
 19         r1=r2=r3=0;
 20         char ch;
 21         scanf("%d",&num1);
 22         for(int i=0;i<num1;++i)
 23         {
 24             getchar();
 25             scanf("%c",&a[i]);
 26             if(a[i]=='1')scanf("%c",&ch);
 27             mp[a[i]]=-1;
 28         }
 29         scanf("%d",&num2);
 30         for(int i=0;i<num2;++i)
 31         {
 32             getchar();
 33             scanf("%c",&b[i]);
 34             if(b[i]=='1')scanf("%c",&ch);
 35             mp[b[i]]=-1;
 36         }
 37         scanf("%d",&k);
 38 
 39         for(int i=0;i<k;++i)
 40         {
 41             if(!(i%2))
 42             {
 43               //  printf("GJ放牌:");
 44                 if(mp[a[r1]]==-1)
 45                 {
 46                    // printf("无牌可收\n");
 47                    mp[a[r1]]=r3;
 48                    c[r3++]=a[r1];
 49                 }
 50                 else{
 51                    //  printf("%d有牌可收\n",mp[a[r1]]);
 52                    c[r3++]=a[r1];
 53                    int rk=r3;
 54                    r3=mp[a[r1]];
 55                    for(int j=mp[a[r1]];j<rk;++j)
 56                    {
 57                        a[num1++]=c[j];
 58                        mp[c[j]]=-1;
 59                    }
 60 
 61                 }
 62                 r1++;
 63             }
 64             else
 65             {
 66                // printf("XS放牌:");
 67                  if(mp[b[r2]]==-1)
 68                 {
 69                    //  printf("无牌可收\n");
 70                    mp[b[r2]]=r3;
 71                    c[r3++]=b[r2];
 72                 }
 73                 else{
 74                     //  printf("%d有牌可收\n",mp[b[r2]]);
 75                    c[r3++]=b[r2];
 76                    int rr=r3;
 77                    r3=mp[b[r2]];
 78                    for(int j=mp[b[r2]];j<rr;++j)
 79                    {
 80                        b[num2++]=c[j];
 81                          mp[c[j]]=-1;
 82                    }
 83                 }
 84                 r2++;
 85             }
 86         }
 87         printf("Deck:");
 88         for(int i=0;i<r3;++i)
 89         {
 90             printf(" %c",c[i]);
 91             if(c[i]=='1')printf("0");
 92         }
 93         printf("\nGJ:");
 94         for(int i=r1;i<num1;++i)
 95         {
 96             printf(" %c",a[i]);
 97             if(a[i]=='1')printf("0");
 98         }
 99         printf("\nXS:");
100         for(int i=r2;i<num2;++i)
101         {
102             printf(" %c",b[i]);
103             if(b[i]=='1')printf("0");
104         }printf("\n");
105            printf("\n");
106     }
107     return 0;
108 }

 

posted @ 2017-09-01 08:17  红雨520  阅读(435)  评论(0编辑  收藏  举报