中南大学第十一届大学生程序设计竞赛-COJ1898-复盘拉火车

来源:互联网 发布:linux 退出sqlplus 编辑:程序博客网 时间:2024/05/22 17:49

1898: 复盘拉火车

Submit Page Summary Time Limit: 1 Sec Memory Limit: 128 Mb Submitted: 2 Solved: 2
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

题目大意:扑克牌游戏“拉火车”,给出初始手牌,求k轮后的情况。
解题思路:直接用链表模拟,使用STL中的list进行简化,注意对功能函数进行测试,建议分模块写。
考查内容:基本数据结构的使用
时间复杂度: O(n)
题目难度: ★★

#include<iostream>#include<vector>#include<list>using namespace std;list<string> GJ,XS,DE;void solve(string x,int op){    list<string>::iterator it,pos;    bool flag=false;    for(it=DE.begin();it!=DE.end();it++)    {        if((*it)==x)        {            pos=it;            flag=true;        }    }    if(flag)    {        for(it=pos;it!=DE.end();it++)        {            if(op==1) GJ.push_back(*it);            else XS.push_back(*it);        }        if(op==1) GJ.push_back(x);        else XS.push_back(x);        DE.erase(pos,DE.end());    }else    {        DE.push_back(x);    }}int main(){    ios::sync_with_stdio(false);    cin.tie(0);    cout.tie(0);    int T;    cin>>T;    int n;    while(T--)    {        GJ.clear();XS.clear();DE.clear();        cin>>n;        string tmp;        list<string>::iterator it;        for(int i=1;i<=n;i++)        {            cin>>tmp;            GJ.push_back(tmp);        }        cin>>n;        for(int i=1;i<=n;i++)        {            cin>>tmp;            XS.push_back(tmp);        }        cin>>n;        for(int i=1;i<=n;i++)        {            if(i&1)            {                string g=GJ.front();                GJ.pop_front();                solve(g,1);            }else            {                string x=XS.front();                XS.pop_front();                solve(x,2);            }        }        cout<<"Deck:";        for(it=DE.begin();it!=DE.end();it++)            cout<<" "<<*it;        cout<<endl;        cout<<"GJ:";        for(it=GJ.begin();it!=GJ.end();it++)            cout<<" "<<*it;        cout<<endl;        cout<<"XS:";        for(it=XS.begin();it!=XS.end();it++)            cout<<" "<<*it;        cout<<endl<<endl;    }    return 0;}
1 0