通过率 71% · 提交 394 · 通过 279
小慕正在设计一款单人卡牌游戏,每张卡牌包含颜色和数字两个属性。颜色有红、黄、蓝、绿四种,数字为0到9中的一个。 游戏开始时,小慕从中选出一张卡牌打出。之后,只要他手中有与上一次打出的卡牌颜色相同或数字相同的卡牌,他就可以继续打出这张牌,直到手牌全部打完,或者没有符合条件的卡牌可以继续打出。 现在给定小慕的一副手牌,请你帮他找到,使得他能打出的卡牌数量最多。
这类题属于华为 OD 机考真题方向中「200分 / DFS」方向的高频题型,通常考察对「200分 / DFS」的建模能力与边界条件处理。掌握本题的解题思路后,可举一反三应对同类真题方向,稳步提升机考通过率。
提示:带虚线的词点一下有通俗解释。
输入为两行,第一行是每张手牌的数字,数字由空格分隔,第二张为对应的每张手牌的颜色, 用r y b g这4个字母分别代表4种颜色,字母也由空格分隔。手牌数量不超过10。
输出一个数字,即最多能打出的手牌的数量。
示例 1
输入示例
1 4 3 4 5 r y b b r
输出示例
3
如果打出1r,那么下面只能再打出5r,共打出两张牌,而按照4y-4b-3b的顺序则可以打出三张牌,故输出3
示例 2
输入示例
1 2 3 4 r y b g
本平台为独立第三方培训机构,与华为技术有限公司无任何关联;课程的服务内容与权益以购买协议为准,学习效果因个人情况而异。「华为 OD」「华为可信」等仅为对岗位与考试方向的客观描述,相关商标归各自权利人所有。
每张手牌有颜色(红/黄/蓝/绿)和数字(0~9)两个属性。第一张牌可以任意打出,之后每张牌必须与上一张打出的牌颜色相同或数字相同才能继续打出,直到手牌打完或无牌可接。求最优出牌顺序下最多能打出多少张牌。
手牌数量很小,直接用回溯(DFS)穷举所有可能的出牌顺序即可。
参考代码把每张牌拆成 nums(数字)与 colors(颜色)两个平行数组,同一下标 i 对应同一张牌,用 used 数组标记牌是否已打出:
1. 递归状态:dfs(cur_color, cur_num, path_len, ...) 中前两个参数记录上一张打出的牌的颜色和数字,path_len 是当前出牌序列的长度。 2. 进入函数先更新答案:ans = max(path_len, ans) 放在函数开头,意味着任何中途状态都会被统计——不要求把手牌全部打完,打到「无牌可接」为止的最长序列同样会被记录,与题意吻合。 3. 横向枚举:遍历所有手牌,凡是未用过、且颜色或数字与上一张相同的牌都可作为下一张:标记 used[i] = True → 递归(path_len + 1)→ 回滚 used[i] = False,穷举所有可行的出牌顺序。 4. 枚举起点:主循环让每张牌轮流作为第一张(第一张不受任何限制),以 path_len = 1 进入递归,同样配对做标记与回滚。
这样所有可能的出牌序列都被覆盖,ans 即能打出的最多牌数。
used 数组与递归栈深度。登录后可查看你在本题的历史提交,以及每次的各用例通过情况。
输出示例
1
没有能够连续出牌的组合,只能在开始时打出一张手牌,故输出1
时间限制 1000 ms · 内存限制 128 MB
© 2026 广州慕课网络科技有限公司 · 吴师兄学算法官网 版权所有