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

📅 2026/7/8 1:23:28
4.15华为OD机试真题 新系统 - 小猫钓鱼纸牌游戏 (JavaPyCC++JsGo)
小猫钓鱼纸牌游戏2026 华为OD机试真题 4月15日华为OD上机新系统考试真题 200 分题型点击查看华为 OD 机试真题完整目录2026最新华为OD机试新系统卷 双机位C卷 真题题库目录全覆盖题库 逐点算法考点详解题目描述有两名玩家甲和乙他们玩一种“小猫钓鱼”扑克牌游戏。扑克牌为 A、2、3、…、J、Q、K不考虑花色都用 1−13来表示然后给甲、乙两人各发 n 张牌按给定顺序排成 队列这些牌背面朝上正面朝下放置队列的第一个元素是背面的第一张牌。游戏规则如下:出牌与收牌初始出牌时甲先出牌打出的牌正面朝上放在桌面的最底部然后乙出牌正面朝上放在甲的牌张上面然后甲乙轮流出牌直到触发收牌或者任意一个玩家牌出完。如果玩家出牌后触发了收牌则把收到的一摞牌作为整体翻面后背面朝上正面朝下放到现有牌的底部然后当前收牌的玩家继续出牌。收牌规则若当前打出的牌点数与桌面上之前某张牌的点数相同则触发收牌收牌的范围是两张相同点数牌之间的所有牌(含这两张)。若当前打出的牌是 J并且此时桌面上已有至少一张牌(不含当前这张)则当前玩家触发收牌收牌的范围是桌面上的所有牌。若桌面上原本没有牌则 J仅作为普通牌放到桌面游戏结束条件若某位玩家在自己回合开始时已经没有牌可出则游戏立即结束如果此时对方还有余牌则对方获胜如果对方也无牌则平局。若在模拟过程中出牌总次数超过一个上限(10000 次)仍未结束则认为游戏进入死循环判定为平局。2026 华为OD机试真题 4月15日华为OD上机新系统考试真题 200 分题型输入描述甲的初始牌队列和乙的初始牌队列甲乙初始手牌数量相等均为整数 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桌面为31 7. 甲出3匹配桌面上的3桌面变为空甲变为3,1,3 8. 甲出3剩余1,3桌面3 9. 乙出1乙变为空桌面变为31 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。复杂度分析时间复杂度最大出牌次数被限制在 $10000$ 次。每次出牌需要在桌面上查找是否有同点数牌桌面最多也就两百张牌单次查找复杂度为 $O(M)$。整体时间复杂度为 $O(K \times M)$$K \le 10000$非常高效。空间复杂度$O(M)$其中 $M$ 为初始双方牌的数量之和最大 200 张。主要用于存储玩家手牌队列和桌面栈空间