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("无牌可收 "); 47 mp[a[r1]]=r3; 48 c[r3++]=a[r1]; 49 } 50 else{ 51 // printf("%d有牌可收 ",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("无牌可收 "); 70 mp[b[r2]]=r3; 71 c[r3++]=b[r2]; 72 } 73 else{ 74 // printf("%d有牌可收 ",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(" GJ:"); 94 for(int i=r1;i<num1;++i) 95 { 96 printf(" %c",a[i]); 97 if(a[i]=='1')printf("0"); 98 } 99 printf(" XS:"); 100 for(int i=r2;i<num2;++i) 101 { 102 printf(" %c",b[i]); 103 if(b[i]=='1')printf("0"); 104 }printf(" "); 105 printf(" "); 106 } 107 return 0; 108 }