• Python:每日一题之拉马车


    题目描述

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

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

    其规则简述如下:

    假设参加游戏的小朋友是 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 先出牌,最后赢的一方手里的牌序。

    输入输出样例

    输入

    1. 96J5A898QA
    2. 6278A7Q973

    输出

    2J9A7QA6Q6889977

     参考代码:

    1. import os
    2. import sys
    3. # A手里与B手里的牌
    4. A = list(input())
    5. B = list(input())
    6. # 牌桌上的牌
    7. Z = ''
    8. # 出牌的顺序
    9. flag = 'A'
    10. # 判断出的牌是否在牌堆里
    11. def isNot(Z):
    12. # -1表示最后一个 切片是左闭右开 这个是判断最后一个在不在 最后一个之前
    13. return Z[-1] in Z[0:-1]
    14. # 应该收上来的牌
    15. def get(Z, index):
    16. # 返回这个牌在牌堆里的位置到倒数第二个 左闭右开 依题意进行倒序
    17. return list(Z[index:-1])[::-1]
    18. while len(A) != 0 and len(B) != 0:
    19. if flag == 'A' and len(A) != 0:
    20. # temp表示要放下的牌 每次牌都是放手里的第一张
    21. temp = A[0]
    22. # 将出的牌加入牌堆
    23. Z += temp
    24. # 减掉自己手上相应的牌
    25. A = A[1:]
    26. # 判断出的牌在不在牌堆中
    27. if isNot(Z): # 如果在就将对应的牌追加到A手里
    28. # 因为上面的收上去的牌的方法是到倒数第二个 所以要先添加进去
    29. A.append(temp)
    30. # index的返回是返回第一个对应的
    31. A.extend(get(Z,Z.index(temp)))
    32. # 添加完之后 删掉牌堆对应的
    33. Z = Z[:Z.index(temp)]
    34. else:
    35. flag = 'B'
    36. elif flag == 'B' and len(B) != 0:
    37. # temp表示要放下的牌 每次牌都是放手里的第一张
    38. temp = B[0]
    39. # 将出的牌加入牌堆
    40. Z += temp
    41. # 减掉自己手上相应的牌
    42. B = B[1:]
    43. # 判断出的牌在不在牌堆中
    44. if isNot(Z): # 如果在就将对应的牌追加到B手里
    45. # 因为上面的收上去的牌的方法是到倒数第二个 所以要先添加进去
    46. B.append(temp)
    47. # index的返回是返回第一个对应的
    48. B.extend(get(Z,Z.index(temp)))
    49. # 添加完之后 删掉牌堆对应的
    50. Z = Z[:Z.index(temp)]
    51. else:
    52. flag = 'A'
    53. if flag == 'A':
    54. print("".join(A))
    55. elif flag == 'B':
    56. print("".join(B))
    57. else:
    58. print(-1)

  • 相关阅读:
    Python 绘图大全之使用 Python Folium 制作生成热图的详细指南
    java 多个 @Scheduled定时器不执行
    Spring Cloud 项目打印Sql日志
    史上最全 499 道 Java 面试题:JVM+ 分布式 + 算法 + 锁 +MQ+ 微服务 + 数据库
    MySQL双主模式(2022/11/19)
    简单的Hystrix熔断
    python 根据两个向量,求的之间的旋转矩阵:
    mysql索引失效的几个场景
    Qt 之 全局的QNetworkAccessManager
    记一次 Java Testcontainers CPU 100% 问题排查过程
  • 原文地址:https://blog.csdn.net/qq_65144447/article/details/127879386