1. 常规胡牌条件(面子 + 对子)
正常的胡牌满足数学形式 (3n + 2)(如 14 张、17 张)。
手牌需组成:(M \times \text{顺子}(ABC) + K \times \text{刻子}(DDD) + \text{将牌}(EE))。
2. 核心算法:回溯递归法(拆解法)
最常用的编程判定思路如下:
- 剔除对子: 遍历手牌,假设某张牌作为“将牌”(一对),将其从手牌中扣除。
- 递归拆解: 检查剩余的牌是否能完全组成顺子(如 123)或刻子(如 111)。
- 从左到右扫描剩余牌,找到第一张未处理的牌;
- 尝试将其与后面的牌组成顺子或刻子;
- 移除这些牌,并递归调用自身继续拆解;
- 如果所有牌最终都能被拆完,则说明可以胡牌。
3. 特殊牌型算法
除了常规的 (3n + 2) 牌型外,许多地方麻将或国标麻将包含特殊胡法,需要单独的逻辑分支判断:
- 七对子: 手牌由 7 个不同的对子组成,算法只需统计手牌中对子的数量是否等于 7 即可。
- 十三幺(国士无双): 包含全部 13 种幺九牌(一、九万/筒/条,东南西北中发白),且其中某一种有一对,其余各一张。
4. 带“赖子”(百搭牌)算法优化
对于包含“财神/白板/赖子”的麻将,算法需要利用查表法。
- 提前为每种花色(万、条、筒、字)的 (3n) 和 (3n+2) 组合建立状态表(例如用一维数组或位运算表示牌的数量)。
- 用赖子去填补手牌与标准组合之间的空缺,若填补后的牌型在预设表中命中,则可胡牌。
