蓝桥杯 10.拉马车

拉马车

原题目链接

题目描述

小时候你玩过纸牌游戏吗?

有一种叫做 "拉马车" 的游戏,规则简单但非常吸引小朋友。

游戏规则简述如下:

假设参加游戏的小朋友是 AB,游戏开始时,他们得到的随机纸牌序列如下:

  • 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 双方轮流出牌:

  1. 每次出牌从自己的纸牌队列头部拿出一张放在桌上(压在已有牌堆最上方);
  2. 若当前出的牌在桌上的已有牌中出现过同牌点,则**从那一张牌开始到当前牌之间的所有纸牌(包括当前)**归该玩家所有;
  3. 将这些纸牌按出现在桌上的逆序加入自己手牌队尾;
  4. 获胜方继续出下一张牌。

若当前出的牌在桌面上没有同点牌,则另一方继续出牌。

结束条件:

  • 当某一方打出最后一张牌,且无法赢得桌上任何牌时,游戏立即结束。
  • 任务是判断谁赢了,并输出其最终手中纸牌的顺序

若游戏无法结束(死循环),输出 -1


输入描述

  • 输入 2 行,每行为一个字符串,表示 A 和 B 初始牌序。
  • 字符串中每个字符为:2~9AJQKX(代表10)。
  • 输入字符串长度不超过 30。

输出描述

  • 如果游戏有赢家,输出赢家手中纸牌的字符串(按顺序);
  • 如果游戏无法结束,输出 -1

输入样例

in 复制代码
96J5A898QA
6278A7Q973

输出样例

out 复制代码
2J9A7QA6Q6889977

c++代码

cpp 复制代码
#include<bits/stdc++.h>

using namespace std;

int main() {
    string a, b;
    cin >> a >> b;
    int m = a.size(), n = b.size(), l = 0, r = 0, key = 0;
    stack<char> st;
    unordered_set<char> mp;
    while(true) {
        if (l == a.size()) {
            int len = m + n - st.size();
            cout << b.substr(b.size() - len);
            return 0;
        }
        if (r == b.size()) {
            int len = m + n - st.size();
            cout << a.substr(a.size() - len);
            return 0;
        }
        if (key % 2 == 0) {
            if (mp.find(a[l]) == mp.end()) st.push(a[l]), mp.insert(a[l]);
            else {
                key--, a += a[l];
                while(!st.empty()) {
                    char c = st.top();
                    a += c;
                    mp.erase(c), st.pop();
                    if (c == a[l]) break;
                }
            }
            l++;
        }
        else {
            if (mp.find(b[r]) == mp.end()) st.push(b[r]), mp.insert(b[r]);
            else {
                key--, b += b[r];
                while(!st.empty()) {
                    char c = st.top();
                    b += c;
                    mp.erase(c), st.pop();
                    if (c == b[r]) break;
                }
            }
            r++;
        }
        key++;
    }
    return 0;
}//by wqs

思路解析

本题是一个模拟题,因为字符串长度不超过30,所以直接暴力模拟就行。

相关推荐
ajassi20002 小时前
开源 C++ QT Widget 开发(十五)多媒体--音频播放
linux·c++·qt·开源
焦耳加热3 小时前
阿德莱德大学Nat. Commun.:盐模板策略实现废弃塑料到单原子催化剂的高值转化,推动环境与能源催化应用
人工智能·算法·机器学习·能源·材料工程
wan5555cn3 小时前
多张图片生成视频模型技术深度解析
人工智能·笔记·深度学习·算法·音视频
u6063 小时前
常用排序算法核心知识点梳理
算法·排序
鹅毛在路上了4 小时前
C++, ffmpeg, libavcodec-RTSP拉流,opencv实时预览
c++·opencv·ffmpeg
John_ToDebug5 小时前
定制 ResourceBundle 的实现与 DuiLib 思想在 Chromium 架构下的应用解析
c++·chrome·ui
蒋星熠5 小时前
Flutter跨平台工程实践与原理透视:从渲染引擎到高质产物
开发语言·python·算法·flutter·设计模式·性能优化·硬件工程
小欣加油6 小时前
leetcode 面试题01.02判定是否互为字符重排
数据结构·c++·算法·leetcode·职场和发展
3Cloudream6 小时前
LeetCode 003. 无重复字符的最长子串 - 滑动窗口与哈希表详解
算法·leetcode·字符串·双指针·滑动窗口·哈希表·中等
王璐WL6 小时前
【c++】c++第一课:命名空间
数据结构·c++·算法