小猫钓鱼纸牌游戏
2026 华为OD机试真题 4月15日华为OD上机新系统考试真题 200 分题型
点击查看华为 OD 机试真题完整目录:2026最新华为OD机试新系统卷 + 双机位C卷 真题题库目录|全覆盖题库 + 逐点算法考点详解
题目描述
有两名玩家甲和乙,他们玩一种“小猫钓鱼”扑克牌游戏。扑克牌为 A、2、3、…、J、Q、K,不考虑花色都用 1−13来表示,然后给甲、乙两人各发 n 张牌,按给定顺序排成 队列,这些牌背面朝上,正面朝下放置,队列的第一个元素是背面的第一张牌。
游戏规则如下:
- 出牌与收牌
- 初始出牌时,甲先出牌,打出的牌正面朝上放在桌面的最底部,然后乙出牌,正面朝上放在甲的牌张上面,然后甲乙轮流出牌,直到触发收牌或者任意一个玩家牌出完。
- 如果玩家出牌后触发了收牌,则把收到的一摞牌作为整体翻面后,背面朝上正面朝下放到现有牌的底部,然后当前收牌的玩家继续出牌。
- 收牌规则
- 若当前打出的牌点数,与桌面上之前某张牌的点数相同,则触发收牌,收牌的范围是两张相同点数牌之间的所有牌(含这两张)。
- 若当前打出的牌是 J,并且此时桌面上已有至少一张牌(不含当前这张),则当前玩家触发收牌,收牌的范围是桌面上的所有牌。若桌面上原本没有牌,则 J仅作为普通牌放到桌面
- 游戏结束条件
- 若某位玩家在自己回合开始时已经没有牌可出,则游戏立即结束,如果此时对方还有余牌,则对方获胜,如果对方也无牌,则平局。
- 若在模拟过程中,出牌总次数超过一个上限(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,剩余3,桌面1
- 乙出1,剩余3,匹配桌面1,拿走1,1,桌面牌为空。放回乙,乙当前变为3,1,1
- 乙出3,剩余1,1 桌面为3
- 甲出3,匹配桌面的3,拿走3,3,桌面牌为空,甲变为3,3
- 甲出3,剩余3,桌面为3
- 乙出1,剩余1,桌面为3,1
- 甲出3,匹配桌面上的3,桌面变为空,甲变为3,1,3
- 甲出3,剩余1,3,桌面3
- 乙出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
解题思路
核心思想
本题是对经典扑克牌游戏“小猫钓鱼”的模拟。题目明确给出了甲乙轮流出牌、收牌等规则,可以通过队列(或列表)模拟玩家手牌,使用列表(栈)模拟桌面牌堆进行求解。
- 玩家手牌管理:甲乙的手牌可以用队列结构模拟。回合开始时,如果当前玩家无牌可出,则游戏结束:若对方有牌,对方获胜(输出对方的队头牌);若对方也无牌,则平局。
- 桌面牌堆管理:桌面的牌是一个栈结构,每次出牌即队头元素出队,打出的牌压入栈顶。
- 收牌逻辑:
- 每次打出一张牌后,判断是否触发收牌。
- 当打出的牌是
11(即J)且桌面上(不包含这张 J)已有牌时,触发全收。 - 否则,检查当前打出的牌是否与桌面(除刚打出的牌外)上的某张牌同点数。如果是,则将这两张同点数牌之间的所有牌(含两端)收走。
- 收牌顺序:题目要求把收到的一摞牌作为整体翻面后放到现有牌底部。这等价于将要收走的牌按“桌面从底到顶”的顺序,依次加入收牌者的队尾。
- 收牌后,当前玩家继续出牌,不切换对手;否则切换对手。
- 游戏终止条件:
- 某一方无牌可出,游戏结束,判定胜负。
- 题目设定如果总出牌次数超过
10000次仍未结束,则判定为平局。 - 平局时输出桌面栈顶牌,如果桌面为空输出
0。
复杂度分析
- 时间复杂度:最大出牌次数被限制在 次。每次出牌需要在桌面上查找是否有同点数牌,桌面最多也就两百张牌,单次查找复杂度为 。整体时间复杂度为 (),非常高效。
- 空间复杂度:,其中 为初始双方牌的数量之和(最大 200 张)。主要用于存储玩家手牌队列和桌面栈,空间开销极小。