麻将基本胡牌型判断
2026 华为OD机试真题 5.17华为OD上机新系统考试真题 100 分题型
点击查看华为 OD 机试真题完整目录:2026最新华为OD机试新系统卷 + 双机位C卷 真题题库目录|全覆盖题库 + 逐点算法考点详解
题目描述
给定14张麻将牌,只包含三种花色:万(用1表示)、条(用2表示)、筒(用3表示),每种花色有1-9共9种点数。请判断这14张牌是否能组成基本胡牌型(4个面子 + 1对将牌)。
胡牌规则:
-
面子:可以是以下两种之一:
i. 顺子:同花色连续三张牌,例如:1万2万3万
ii. 刻子:三张相同的牌,例如:5条5条5条
-
将牌:两张相同的牌
3.胡牌条件:14张牌正好组成4组面子 + 1组将牌
输入描述
第一行包含14个整数,表示每张牌的花色(1-3)
第二行包含14个整数,表示每张牌的点数(1-9)
输入保证:
- 每张牌的花色和点数对应
- 同一副牌中可能有多张相同的牌
输出描述
输出一行:
- 如果能够组成基本胡牌型,返回胡牌组合的数量
- 如果不能,返回0
示例1
输入
[1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2], [1, 2, 3, 4, 5, 6, 7, 8, 9, 1, 2, 3, 4, 4]
输出
1
说明
123456789万(3个顺子)
1234条(1个顺子)
44条(将牌)
总共4个顺子 + 1对将牌,满足胡牌条件。
示例2
输入
[1, 1, 1, 2, 2, 2, 3, 3, 3, 1, 1, 1, 2, 2], [1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 5, 6, 4, 4]
输出
1
说明
111万(刻子)
222条(刻子)
333筒(刻子)
456万(顺子)
示例3
输入
[1, 1, 1, 1, 2, 2, 2, 3, 3, 3, 1, 1, 2, 3], [1, 2, 3, 4, 2, 3, 4, 2, 3, 4, 5, 6, 7, 8]
输出
0
说明
不能胡牌
解题思路
本题要求判断 14 张麻将牌是否能组成“基本胡牌型”(4个面子 + 1对将牌)。
-
牌的表示:
- 共有 3 种花色,每种花色 1-9 点。我们可以用一个长度为 27 的数组来统计每种牌的数量(索引 $i = (花色-1) \times 9 + (点数-1)$)。
-
解题步骤:
- 统计频率:首先统计输入中 14 张牌的分布。
- 枚举将牌:遍历 27 种牌,如果某种牌的数量 $\ge 2$,则可以尝试将其作为“将牌”(一对)。
- 递归拆解面子:扣除将牌后,剩下 12 张牌需要拆解成 4 个“面子”(顺子或刻子)。
- 使用 回溯/深度优先搜索 (DFS) 进行拆解。
- 在搜索过程中,优先处理序号最小的牌。
- 尝试拆成刻子:如果当前牌数量 $\ge 3$,扣除 3 张继续搜索。
- 尝试拆成顺子:如果当前牌、下一张牌、下下张牌数量都 $\ge 1$,且它们属于同一花色,扣除 3 张继续搜索。
- 记忆化搜索:由于拆解过程中会出现重复状态,使用记忆化(如 Python 的
lru_cache或哈希表)来加速。 - 计算结果:累加所有可能的胡牌组合数量。
复杂度分析
- 时间复杂度:$O(27 \times S)$,其中 27 是枚举将牌的种类,$S$ 是拆解 12 张牌的面子时的状态数。由于只有 12 张牌,搜索空间非常小,实际运行速度极快。
- 空间复杂度:$O(S)$,用于存储搜索过程中的状态。
版权声明:
作者:魔改工程师
链接:https://www.sylblog.xin/archives/412
文章版权归作者所有,未经允许请勿转载。
THE END