Python:每日一题之拉马车
创始人
2024-01-25 14:51:12

题目描述

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

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

其规则简述如下:

假设参加游戏的小朋友是 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 双方的手里牌为:

AA 方:[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、BA、B 双方初始手里的牌序列。我们约定,输入的串的长度不超过 30。2J9A7QA6Q6889977

输出描述

输出为 1 行,1 个串,表示 A 先出牌,最后赢的一方手里的牌序。

输入输出样例

输入

96J5A898QA
6278A7Q973

输出

2J9A7QA6Q6889977

 参考代码:

import os
import sys# A手里与B手里的牌
A = list(input())
B = list(input())
# 牌桌上的牌
Z = ''
# 出牌的顺序
flag = 'A'# 判断出的牌是否在牌堆里
def isNot(Z):# -1表示最后一个  切片是左闭右开  这个是判断最后一个在不在 最后一个之前return Z[-1] in Z[0:-1]# 应该收上来的牌
def get(Z, index):# 返回这个牌在牌堆里的位置到倒数第二个 左闭右开 依题意进行倒序return list(Z[index:-1])[::-1]while len(A) != 0 and len(B) != 0:if flag == 'A' and len(A) != 0:# temp表示要放下的牌 每次牌都是放手里的第一张temp = A[0]# 将出的牌加入牌堆Z += temp# 减掉自己手上相应的牌A = A[1:]# 判断出的牌在不在牌堆中if isNot(Z):  # 如果在就将对应的牌追加到A手里# 因为上面的收上去的牌的方法是到倒数第二个 所以要先添加进去A.append(temp)# index的返回是返回第一个对应的A.extend(get(Z,Z.index(temp)))# 添加完之后 删掉牌堆对应的Z = Z[:Z.index(temp)]else:flag = 'B'elif flag == 'B' and len(B) != 0:# temp表示要放下的牌 每次牌都是放手里的第一张temp = B[0]# 将出的牌加入牌堆Z += temp# 减掉自己手上相应的牌B = B[1:]# 判断出的牌在不在牌堆中if isNot(Z):  # 如果在就将对应的牌追加到B手里# 因为上面的收上去的牌的方法是到倒数第二个 所以要先添加进去B.append(temp)# index的返回是返回第一个对应的B.extend(get(Z,Z.index(temp)))# 添加完之后 删掉牌堆对应的Z = Z[:Z.index(temp)]else:flag = 'A'if flag == 'A':print("".join(A))
elif flag == 'B':print("".join(B))
else:print(-1)

相关内容

热门资讯

埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
超纤皮是什么皮 超纤皮好不好 相信大家买车的时候,很多人都会选择皮座椅,因为不但有档次,而且手感也会比织物的好。但是大家想过没有,...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
超纤皮是什么皮 超纤皮好不好 相信大家买车的时候,很多人都会选择皮座椅,因为不但有档次,而且手感也会比织物的好。但是大家想过没有,...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...