蓝桥杯 PREV-43 拉马车(试题解析)

news/2025/2/13 6:39:25/

试题 历届试题 拉马车

提交此题   评测记录  

资源限制

时间限制:1.0s   内存限制:256.0MB

问题描述

  小的时候,你玩过纸牌游戏吗?
  有一种叫做“拉马车”的游戏,规则很简单,却很吸引小朋友。


  其规则简述如下:
  假设参加游戏的小朋友是A和B,游戏开始的时候,他们得到的随机的纸牌序列如下:
  A方:[K, 8, X, K, A, 2, A, 9, 5, A]
  B方:[2, 7, K, 5, J, 5, Q, 6, K, 4]


  其中的X表示“10”,我们忽略了纸牌的花色。


  从A方开始,A、B双方轮流出牌。


  当轮到某一方出牌时,他从自己的纸牌队列的头部拿走一张,放到桌上,并且压在最上面一张纸牌上(如果有的话)。


  此例中,游戏过程:
  A出K,B出2,A出8,B出7,A出X,此时桌上的序列为:


  K,2,8,7,X


  当轮到B出牌时,他的牌K与桌上的纸牌序列中的K相同,则把包括K在内的以及两个K之间的纸牌都赢回来,放入自己牌的队尾。注意:为了操作方便,放入牌的顺序是与桌上的顺序相反的。
  此时,A、B双方的手里牌为:
  A方:[K, A, 2, A, 9, 5, A]
  B方:[5, J, 5, Q, 6, K, 4, K, X, 7, 8, 2, K]


  赢牌的一方继续出牌。也就是B接着出5,A出K,B出J,A出A,B出5,又赢牌了。
  5,K,J,A,5
  此时双方手里牌:
  A方:[2, A, 9, 5, A]
  B方:[Q, 6, K, 4, K, X, 7, 8, 2, K, 5, A, J, K, 5]


  注意:更多的时候赢牌的一方并不能把桌上的牌都赢走,而是拿走相同牌点及其中间的部分。但无论如何,都是赢牌的一方继续出牌,有的时候刚一出牌又赢了,也是允许的。


  当某一方出掉手里最后一张牌,但无法从桌面上赢取牌时,游戏立即结束。


  对于本例的初始手牌情况下,最后A会输掉,而B最后的手里牌为:


  9K2A62KAX58K57KJ5


  本题的任务就是已知双方初始牌序,计算游戏结束时,赢的一方手里的牌序。当游戏无法结束时,输出-1。


  输入为2行,2个串,分别表示A、B双方初始手里的牌序列。
  输出为1行,1个串,表示A先出牌,最后赢的一方手里的牌序。

样例输入

96J5A898QA
6278A7Q973

样例输出

2J9A7QA6Q6889977

样例输入

25663K6X7448
J88A5KJXX45A

样例输出

6KAJ458KXAX885XJ645

数据规模和约定

  我们约定,输入的串的长度不超过30


  资源约定:
  峰值内存消耗(含虚拟机) < 256M
  CPU消耗 < 1000ms




  请严格按要求输出,不要画蛇添足地打印类似:“请您输入...” 的多余内容。


  注意:
  main函数需要返回0;
  只使用ANSI C/ANSI C++ 标准;
  不要调用依赖于编译环境或操作系统的特殊函数。
  所有依赖的函数必须明确地在源文件中 #include <xxx>
  不能通过工程设置而省略常用头文件。


  提交程序时,注意选择所期望的语言类型和编译器类型。


  ----------------------------

  笨笨有话说:
  不断删除前边的,又要后边添加.... 如果用数组,需要开一个大点的,请佛祖保佑在游戏结束前,不会用到数组的边缘。


  歪歪有话说:
  反正串也不长,不如每次操作都返回一个新的串。


  默默有话说:
  我一般都不吱声,这是典型的队列结构,动态数组最好,没有?自己造一个呗!

 

我说:写完这道题,虽然心累,但最终也算跑满分了,不枉我忙活了一晚上。这道题我主要用了队列和向量,来存放纸牌序列。其中有涉及到队列、向量的遍历、元素查找,部分元素的清空删除。。。。。。 不过,这一道题也让我对queue、stack(一开始准备用栈存放桌上的纸牌序列,无奈栈中元素查找 太复杂,遂选用向量)、vector有了更深的认识。

代码如下:

#include <iostream>
#include <queue>
#include <stack>
#include <string>
#include <algorithm>
#include <vector>

using namespace std;

queue<char> A;
queue<char> B;
vector<char> tmp;
string sa,sb;


void ReadInput(){

    cin>>sa>>sb;
    int la=sa.size();
    int lb=sb.size();

    for(int i=0;i<la;i++){
        A.push(sa[i]);
    }
    for(int i=0;i<lb;i++){
        B.push(sb[i]);
    }

}

void singleDemo(queue<char> &Q){


    char cq=Q.front();

    Q.pop();


    vector<char>::iterator it=find(tmp.begin(),tmp.end(),cq);
    if( it==tmp.end() ){//未找到
        tmp.push_back(cq);
    }
    else{//找到的话
        Q.push(cq);

        for(vector<char>::iterator itr=tmp.end()-1;itr>=it;itr--) {
            Q.push(*itr);
        }
        tmp.erase(it,tmp.end());
        singleDemo(Q);
    }

}

void traverse(queue<char> Q){
    int size=Q.size();
    for(int it=0;it<size;it++){
        cout<<Q.front();
        Q.push(Q.front());
        Q.pop();
    }
}


void Gaming(){
    int cnt=0;
    int flag=0;
    while(1){
        singleDemo(A);
        if(A.size()==0){
            flag=1;

            break;
        }

        singleDemo(B);
        if(B.size()==0){
            flag=2;

            break;
        }
        cnt++;
        if(cnt>=888)
                break;
    }
    if(cnt>=888){
        cout<<"-1"<<endl;
    }
    else if(flag==1){
        traverse(B);
    }
    else if(flag==2){
        traverse(A);
    }

}

int main(int argc, char** argv) {
    ReadInput();
    Gaming();

    return 0;
}
 


http://www.ppmy.cn/news/183368.html

相关文章

icom对讲机写频线定义_哈罗CQ火腿社区 - QRP and DIY - 各种写频线的资料,放上来备用吧 - Powered by phpwind...

原作者:广润通信(名古屋) 一、八重洲威泰克斯写频器: 1 手持机写频器(3.5MM 4段插头):支持可对八重洲/威泰克斯VX-1R 2R 5R 60R VX160/168/180/400/210A/418/428/等读写频(如写6R 7R需对接口作少许修改)。 注明:附带USB取电线防止因串口取电不足而没法读写频。 2 车载机…

业余无线电入门教程

文章目录 第 1 章 什么是业余无线电&#xff1f;1.1 解释两个名词1.2 五种常见的通联方式1.3 电台执照 第 2 章 Ham能够做什么&#xff1f;2.1 本地通联2.2 远程通联2.3 数字通联2.4 网上通联2.5 外空通联2.6 通联竞赛2.7 自制设备2.8 应急通讯 第 3 章 如何成为一名Ham3.1 中国…

笔记本不充电问题的解决

笔记本:HP CQ43 ,系统win7 ,电量不足100,总是显示 xx%可用(电源已接通,未充电),从网上找的解决办法好像也不起作用. 解决办法:将电源线连接笔记本一端接入笔记本电源接口时,稍稍保留一点,别完全插到底,就可以充电啦.HP CQ43可以确定这样解决,其他本子可以试试看.

ubuntu CQ45安装WIFI BCM4312

更新源 #sudo apt-get update 安装驱动 #sudo apt-get install bcmwl-kernel-source #Broadcom 802.11 Linux STA 无线驱动源 #sudo apt-get install broadcom-sta-common #sudo apt-get install broadcom-sta-source #sudo apt-get install b43-fwcutter …

CQ18阶梯赛第二场

H国的身份证号码I HihoCoder - 1558 只要单纯的判断一下前后的乘积就好了&#xff0c; 因为不是很想处理倍数的关系&#xff0c; 所以我这里是用 string去处理。 代码&#xff1a; 1 #include<bits/stdc.h>2 using namespace std;3 #define LL long long4 #define ULL u…

Python基于cq-http协议端,使用nonebot2框架制作属于自己的智能机器人

1. 快速创建QQ机器人 WebQQ介绍 WebQQ腾讯公司推出的使用网页方式上QQ的服务&#xff0c;特点是无需下载和安装QQ软件&#xff0c;只要能打开WebQQ的网站就可以登录QQ与好友保持联系。具有Web产品固有的便利性&#xff0c;同时在Web上最大限度的保持了客户端软件的操作习惯。…

无线智能插座Android Studio开发工具MQTTjar包下载配置

该无线智能插座的Android Studio开发工具的MQTTjar包的下载和配置详细步骤如下所示。 (1)Android Studio开发工具的MQTTjar包的下载 Android Studio开发工具的MQTTjar包的下载链接为:https://share.weiyun.com/7hTnSUEx,密码在文章的末尾,复制粘贴到浏览器打开即可,下载…

五种方法提升Midjourney的出图品质

本文基于B站UP主琥珀川Eric的《五种方法提升Midjourney出图品质》制作在此感谢大神的分享。 本文全面介绍以上五种提升Midjourney出图品质的方法&#xff0c;简单实用&#xff0c;马上就可以用上。Lets go&#xff01;&#xff01;&#xff01; 方法一 使用相机参数创建逼真的图…