麻将胡牌算法的核心逻辑

1. 常规胡牌条件(面子 + 对子)

正常的胡牌满足数学形式 \(3n + 2\)(如 14 张、17 张)。
手牌需组成:\(M \times \text{顺子}(ABC) + K \times \text{刻子}(DDD) + \text{将牌}(EE)\)。

all

2. 核心算法:回溯递归法(拆解法)

最常用的编程判定思路如下:

  1. 剔除对子: 遍历手牌,假设某张牌作为“将牌”(一对),将其从手牌中扣除。

  2. 递归拆解: 检查剩余的牌是否能完全组成顺子(如 123)或刻子(如 111)。

    • 从左到右扫描剩余牌,找到第一张未处理的牌;

    • 尝试将其与后面的牌组成顺子或刻子;

    • 移除这些牌,并递归调用自身继续拆解;

    • 如果所有牌最终都能被拆完,则说明可以胡牌。

3. 特殊牌型算法

除了常规的 \(3n + 2\) 牌型外,许多地方麻将或国标麻将包含特殊胡法,需要单独的逻辑分支判断:

  • 七对子: 手牌由 7 个不同的对子组成,算法只需统计手牌中对子的数量是否等于 7 即可。

  • 十三幺(国士无双): 包含全部 13 种幺九牌(一、九万/筒/条,东南西北中发白),且其中某一种有一对,其余各一张。

4. 带“赖子”(百搭牌)算法优化

对于包含“财神/白板/赖子”的麻将,算法需要利用查表法

  • 提前为每种花色(万、条、筒、字)的 \(3n\) 和 \(3n+2\) 组合建立状态表(例如用一维数组或位运算表示牌的数量)。

  • 用赖子去填补手牌与标准组合之间的空缺,若填补后的牌型在预设表中命中,则可胡牌。