← 课程主页

广东普通麻将进阶 · 第 1 课 · 当前已制作第 1~5 课/全课程 39 课

从听牌倒推到向听数

你已经会判断一副听牌胡哪些牌。这一课把"听牌"这个点向前延伸成一把尺,让 14 张牌的每个候选舍法都能放在尺上比较。

一个熟悉的瞬间:摸进第 14 张,舍哪张?

你刚摸起一张牌,手里 14 张:

有人盯着自己喜欢的花色,有人找"最孤"的那张。这一课要回答的问题是:有没有一把统一的尺,让每个候选舍法都能直接比大小?

▶ 快速诊断:如果你已经能稳定报向听数
先别读解释段。直接回答:上面这副 14 张牌,舍哪张进入听牌?听什么?如果你能立刻答出"舍东,听三条、六条",并且平时对 13 张牌报向听基本不出错,可以跳到本课练习区做题,用题目验证后直接进第 2 课。答不出或答错,按顺序往下读。
牌谱记号
本课程用一套缩写记牌:m=万,p=筒,s=条,z=字牌;数字是牌面,所以 45s 就是四条、五条。字牌 1z7z 依次是东、南、西、北、中、发、白。上面这副牌里 1z 就是一张东。正文同时会把牌面画出来,看到记号时对照即可。
一句话结论:向听数回答"距离听牌还差几次有效推进"。和牌记为 -1 向听,听牌记为 0 向听,差一次推进到听牌记为 1 向听(一向听),再往前是二向听。比较 14 张牌怎么舍,就是分别算出每种舍法剩下 13 张的向听数,取最小的那个。

你已经会的"听牌",是这把尺的零点

你现在的判断是二值的:这 13 张要么听牌,要么没听。向听数做的事,是把"没听"继续分开——是没听但只差一步,还是差两步。距离不同,舍牌策略完全不同,所以值得分开。

向听数
当前牌形距离听牌还差几次有效推进。本课程采用常见程序实现的口径:和牌 -1、听牌 0、一向听 1、二向听 2。注意一个口径陷阱:Yan、Li 与 Li 的向听算法论文把 13 张听牌记作"缺一张完成"(deficiency=1),数值和本课程差 1。读任何资料前先确认它用哪套编号,不要把两套数字混用。Yan、Li 与 Li, 2021
推进
摸入一张牌后,在需要时完成一次合法舍牌,使最优后继牌形的向听数下降。"推进"描述的是整手牌的距离变化,不是某两张牌"搭上了"。
2 向听差两次推进
1 向听差一次推进
0 向听听牌:你已会判断
-1和牌

怎么算:一条机械可复现的链

向听数不靠"感觉整齐"。下面这条链可以手工执行,也是开源程序 PyMahjongGB 实际做的事:

  1. 先固定目标为基本和牌型(四组面子加一对将牌;七对、十三幺从第 7 课才并行计算)。
  2. 对 13 张手牌,枚举所有合法拆法:哪些牌组成面子,哪些组成"搭子"(再补一张即成面子的两张牌)或对子,哪些是暂时多余的孤张。
  3. 对每种拆法,计算补成"四面子+一将"所需的最少推进数。
  4. 取所有拆法里的最小值——不是取你第一眼看到的那一种拆法。
  5. 摸到第 14 张时,把每种候选舍牌分别试一遍,比较舍牌后 13 张的向听数。

手工估算有一个常用近似式:8 − 2m − t − p。三个参数的意思是:

牌形有重叠拆法时这个式子会算错,所以它适合解释和粗算,最终答案仍以枚举为准。PyMahjongGB 基本和型算法

例题:同一副 14 张,只有一种舍法进入听牌

牌例条件:14 张 123456m 45s 77s 789p 1z;刚摸牌后,必须舍一张;目标为基本和牌型;向听口径为和牌 -1、听牌 0;本课只用向听数判断推进,有效牌的完整定义在第 4 课给出;除自己手牌外不看任何牌河与副露。

把 14 张实体牌逐一试舍(同牌面的舍法等价,合并后是 13 种候选牌面),结果只有一列是 0:

候选舍牌舍后向听结论
东(1z0进入听牌,听三条、六条
一万至六万任一1仍是一向听
四条、五条、七条任一1仍是一向听
七筒、八筒、九筒任一1仍是一向听

这道题的重点不是"东是孤张所以打东"。孤张只是事后解释;真正的动作是每个候选都被放上同一把尺,然后只有舍东把牌形从一向听压到听牌。完整的动作链是:

14 张待舍牌 舍东 13 张 0 向听:听 自摸三条或六条,直接和牌(0 → -1)

注意动作链的起点写的是"14 张待舍牌",不是"14 张一向听"。向听数是指定舍哪张之后、剩下 13 张的属性;14 张还没决定舍哪张,就还没有一个确定的向听数可贴。这一点在后面几课会反复用到。

以上每个数字都由 PyMahjongGB 基本和型算法逐候选枚举复核,不是手工估计。shanten.cpp

这个方法不能推出什么

向听数只度量"距离",不度量"宽度"。两副同为一向听的牌,能推进它们的牌可能一种、也可能十几种——那是第 4 课有效牌要回答的问题。向听数也不看桌面:听一张只剩 1 张未见的牌,和听一张还有 4 张未见的牌,向听数同样是 0,实际价值完全不同,这留给第 5 课。本课的全部结论只针对基本和牌型;把七对或十三幺的距离混进来,会得到另一组数字,第 7 课再并行比较。最后记住一条常见误判:"牌面局部整齐"不能代替整手牌的最小向听——下面练习 2 你会亲眼看到这个陷阱。

练习:先作答,再看反馈

练习 1 · 以下三副 13 张手牌(目标均为基本和牌型,不看牌河),按离听牌由近到远排序,正确的是?

对。甲是 0 向听,已经听三条、六条;乙是 1 向听,能推进它的是三条、五条;丙是 2 向听。三个答案都由枚举器逐种拆法复核。
再算一次。甲已经听牌(0 向听);乙的 12s、46s 两个搭子都不完整,是 1 向听;丙缺得更多,是 2 向听。注意字牌对子不在这副牌里帮忙——丙的 1z2z 是两张不同的孤张字牌,不是对子。

练习 2 · 回到例题的 14 张 123456m 45s 77s 789p 1z。如果舍四条(4s),舍后是多少向听?

对。舍四条后最优拆法仍是 1 向听。局部"整齐"没有换来整手牌的距离缩短:只有舍东是 0 向听。这就是"顺眼"和"最小向听"的差别。
不对。枚举所有拆法后,舍四条的最佳后继仍是 1 向听:四五条留下一张不能独自成为搭子,但牌形没有倒退两级;它也没有听牌,因为四五条这组等待被你亲手拆掉了一半。

🧠 背诵区 · 记住这 3 件事

点卡片翻面。记的是能用的判断口径,不是死记定义。

⏳ 间隔复习:明天、3 天后各翻一次;学完第 2 课后,把这两课的卡片混在一起抽。

🗣 复述区 · 讲给别人听

能讲清楚,才是真懂。

讲不顺的地方,就是还没真懂的地方 — 发给我,我帮你补上。

📌 推荐主源

Yan、Li 与 Li《A Fast Algorithm for Computing the Deficiency Number of a Mahjong Hand》↗ 向听(缺牌距离)的分解与算法;注意其 13 张 deficiency 编号与本课程口径相差 1,且示例主要是数牌。