麻将胡牌算法的核心逻辑

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

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

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

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

  1. 剔除对子: 遍历手牌,假设某张牌作为“将牌”(一对),将其从手牌中扣除。
  2. 递归拆解: 检查剩余的牌是否能完全组成顺子(如 123)或刻子(如 111)。
  • 从左到右扫描剩余牌,找到第一张未处理的牌;
  • 尝试将其与后面的牌组成顺子或刻子;
  • 移除这些牌,并递归调用自身继续拆解;
  • 如果所有牌最终都能被拆完,则说明可以胡牌。

3. 特殊牌型算法

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

  • 七对子: 手牌由 7 个不同的对子组成,算法只需统计手牌中对子的数量是否等于 7 即可。
  • 十三幺(国士无双): 包含全部 13 种幺九牌(一、九万/筒/条,东南西北中发白),且其中某一种有一对,其余各一张。

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

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

  • 提前为每种花色(万、条、筒、字)的 (3n) 和 (3n+2) 组合建立状态表(例如用一维数组或位运算表示牌的数量)。
  • 用赖子去填补手牌与标准组合之间的空缺,若填补后的牌型在预设表中命中,则可胡牌。

前排吃瓜!楼主别藏!

签到支持!签到支持!

哈哈 我只是来看评论的。

来报道了,来报道了

多谢楼主科普!多谢楼主科普!