华为OD机试真题 新系统 - 小猫钓鱼纸牌游戏 (JavaPyCC++JsGo)

5 阅读5分钟

小猫钓鱼纸牌游戏

2026 华为OD机试真题 4月15日华为OD上机新系统考试真题 200 分题型

点击查看华为 OD 机试真题完整目录:2026最新华为OD机试新系统卷 + 双机位C卷 真题题库目录|全覆盖题库 + 逐点算法考点详解

题目描述

有两名玩家甲和乙,他们玩一种“小猫钓鱼”扑克牌游戏。扑克牌为 A、2、3、…、J、Q、K,不考虑花色都用 1−13来表示,然后给甲、乙两人各发 n 张牌,按给定顺序排成 队列,这些牌背面朝上,正面朝下放置,队列的第一个元素是背面的第一张牌。

游戏规则如下:

  1. 出牌与收牌
    • 初始出牌时,甲先出牌,打出的牌正面朝上放在桌面的最底部,然后乙出牌,正面朝上放在甲的牌张上面,然后甲乙轮流出牌,直到触发收牌或者任意一个玩家牌出完。
    • 如果玩家出牌后触发了收牌,则把收到的一摞牌作为整体翻面后,背面朝上正面朝下放到现有牌的底部,然后当前收牌的玩家继续出牌。
  2. 收牌规则
    • 若当前打出的牌点数,与桌面上之前某张牌的点数相同,则触发收牌,收牌的范围是两张相同点数牌之间的所有牌(含这两张)。
    • 若当前打出的牌是 J,并且此时桌面上已有至少一张牌(不含当前这张),则当前玩家触发收牌,收牌的范围是桌面上的所有牌。若桌面上原本没有牌,则 J仅作为普通牌放到桌面
  3. 游戏结束条件
    • 若某位玩家在自己回合开始时已经没有牌可出,则游戏立即结束,如果此时对方还有余牌,则对方获胜,如果对方也无牌,则平局。
    • 若在模拟过程中,出牌总次数超过一个上限(10000 次)仍未结束,则认为游戏进入死循环,判定为平局。

输入描述

甲的初始牌队列和乙的初始牌队列,甲乙初始手牌数量相等,均为整数 n(1≤n≤100)

输出描述

一方获胜时,输出获胜方手中背面朝上最上方的那张牌的数值。若平局,如果桌面无牌则输出 0,否则输出当前桌面上正面朝上的最上方的那张牌的数值。

示例1

输入

1,2
10,12


输出

12


说明

甲的牌堆为1,2

乙的牌堆为10,12

出牌顺序:甲出 1,乙出 10,甲出 2,乙出 12,甲无牌可出,乙无余牌,游戏结束,平局。

桌面牌堆为1,10,2,12

平局输出桌面排队正面朝上最上牌值12.

示例2

输入

1,3
1,3

输出

1


说明

甲的牌堆为1,3 乙的牌堆为1,3 出牌顺序

  1. 甲出1,剩余3,桌面1
  2. 乙出1,剩余3,匹配桌面1,拿走1,1,桌面牌为空。放回乙,乙当前变为3,1,1
  3. 乙出3,剩余1,1 桌面为3
  4. 甲出3,匹配桌面的3,拿走3,3,桌面牌为空,甲变为3,3
  5. 甲出3,剩余3,桌面为3
  6. 乙出1,剩余1,桌面为3,1
  7. 甲出3,匹配桌面上的3,桌面变为空,甲变为3,1,3
  8. 甲出3,剩余1,3,桌面3
  9. 乙出1,乙变为空,桌面变为3,1 10.甲出1,剩余3,匹配桌面1,拿走1,1,桌面变为3,甲变为3,1,1 11 甲出3, 剩余1,1 匹配桌面3,拿走3,3 桌面变为空,甲变成1,1,3,3 12.甲出3,变为1,3,3 桌面为1 13.乙无牌可出,甲获胜,甲牌非空,输出背面最朝上的牌1

解题思路

核心思想

本题是对经典扑克牌游戏“小猫钓鱼”的模拟。题目明确给出了甲乙轮流出牌、收牌等规则,可以通过队列(或列表)模拟玩家手牌,使用列表(栈)模拟桌面牌堆进行求解。

  1. 玩家手牌管理:甲乙的手牌可以用队列结构模拟。回合开始时,如果当前玩家无牌可出,则游戏结束:若对方有牌,对方获胜(输出对方的队头牌);若对方也无牌,则平局。
  2. 桌面牌堆管理:桌面的牌是一个栈结构,每次出牌即队头元素出队,打出的牌压入栈顶。
  3. 收牌逻辑
    • 每次打出一张牌后,判断是否触发收牌。
    • 当打出的牌是 11(即 J)且桌面上(不包含这张 J)已有牌时,触发全收。
    • 否则,检查当前打出的牌是否与桌面(除刚打出的牌外)上的某张牌同点数。如果是,则将这两张同点数牌之间的所有牌(含两端)收走。
    • 收牌顺序:题目要求把收到的一摞牌作为整体翻面后放到现有牌底部。这等价于将要收走的牌按“桌面从底到顶”的顺序,依次加入收牌者的队尾。
    • 收牌后,当前玩家继续出牌,不切换对手;否则切换对手。
  4. 游戏终止条件
    • 某一方无牌可出,游戏结束,判定胜负。
    • 题目设定如果总出牌次数超过 10000 次仍未结束,则判定为平局。
    • 平局时输出桌面栈顶牌,如果桌面为空输出 0

复杂度分析

  • 时间复杂度:最大出牌次数被限制在 1000010000 次。每次出牌需要在桌面上查找是否有同点数牌,桌面最多也就两百张牌,单次查找复杂度为 O(M)O(M)。整体时间复杂度为 O(K×M)O(K \times M)K10000K \le 10000),非常高效。
  • 空间复杂度O(M)O(M),其中 MM 为初始双方牌的数量之和(最大 200 张)。主要用于存储玩家手牌队列和桌面栈,空间开销极小。