拉马车
题目描述
小时候你玩过纸牌游戏吗?
有一种叫做 "拉马车" 的游戏,规则简单但非常吸引小朋友。
游戏规则简述如下:
假设参加游戏的小朋友是 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 双方轮流出牌:
- 每次出牌从自己的纸牌队列头部拿出一张放在桌上(压在已有牌堆最上方);
- 若当前出的牌在桌上的已有牌中出现过同牌点,则**从那一张牌开始到当前牌之间的所有纸牌(包括当前)**归该玩家所有;
- 将这些纸牌按出现在桌上的逆序加入自己手牌队尾;
- 获胜方继续出下一张牌。
若当前出的牌在桌面上没有同点牌,则另一方继续出牌。
结束条件:
- 当某一方打出最后一张牌,且无法赢得桌上任何牌时,游戏立即结束。
- 任务是判断谁赢了,并输出其最终手中纸牌的顺序。
若游戏无法结束(死循环),输出 -1
。
输入描述
- 输入 2 行,每行为一个字符串,表示 A 和 B 初始牌序。
- 字符串中每个字符为:
2~9
,A
,J
,Q
,K
,X
(代表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,所以直接暴力模拟就行。