← 课程主页
广东普通麻将进阶 · 第 1 课 · 当前已制作第 1~5 课/全课程 39 课
从听牌倒推到向听数
你已经会判断一副听牌胡哪些牌。这一课把"听牌"这个点向前延伸成一把尺,让 14 张牌的每个候选舍法都能放在尺上比较。
一个熟悉的瞬间:摸进第 14 张,舍哪张?
你刚摸起一张牌,手里 14 张:
有人盯着自己喜欢的花色,有人找"最孤"的那张。这一课要回答的问题是:有没有一把统一的尺,让每个候选舍法都能直接比大小?
▶ 快速诊断:如果你已经能稳定报向听数
先别读解释段。直接回答:上面这副 14 张牌,舍哪张进入听牌?听什么?如果你能立刻答出"舍东,听三条、六条",并且平时对 13 张牌报向听基本不出错,可以跳到本课练习区做题,用题目验证后直接进第 2 课。答不出或答错,按顺序往下读。
牌谱记号
本课程用一套缩写记牌:m=万,p=筒,s=条,z=字牌;数字是牌面,所以 45s 就是四条、五条。字牌 1z 至 7z 依次是东、南、西、北、中、发、白。上面这副牌里 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 实际做的事:
- 先固定目标为基本和牌型(四组面子加一对将牌;七对、十三幺从第 7 课才并行计算)。
- 对 13 张手牌,枚举所有合法拆法:哪些牌组成面子,哪些组成"搭子"(再补一张即成面子的两张牌)或对子,哪些是暂时多余的孤张。
- 对每种拆法,计算补成"四面子+一将"所需的最少推进数。
- 取所有拆法里的最小值——不是取你第一眼看到的那一种拆法。
- 摸到第 14 张时,把每种候选舍牌分别试一遍,比较舍牌后 13 张的向听数。
手工估算有一个常用近似式:8 − 2m − t − p。三个参数的意思是:
- m:已完成的面子数。
- t:被采用的搭子数(差一张成面子的两张牌)。它最多只计到 4−m。另外,被选作将牌的那一对不算进 t——否则同一对会被 t 和 p 各扣一次,重复计数。
- p:是否已有一对将牌候选(有记 1,没有记 0)。
牌形有重叠拆法时这个式子会算错,所以它适合解释和粗算,最终答案仍以枚举为准。PyMahjongGB 基本和型算法
例题:同一副 14 张,只有一种舍法进入听牌
牌例条件:14 张 123456m 45s 77s 789p 1z;刚摸牌后,必须舍一张;目标为基本和牌型;向听口径为和牌 -1、听牌 0;本课只用向听数判断推进,有效牌的完整定义在第 4 课给出;除自己手牌外不看任何牌河与副露。
把 14 张实体牌逐一试舍(同牌面的舍法等价,合并后是 13 种候选牌面),结果只有一列是 0:
这道题的重点不是"东是孤张所以打东"。孤张只是事后解释;真正的动作是每个候选都被放上同一把尺,然后只有舍东把牌形从一向听压到听牌。完整的动作链是:
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,且示例主要是数牌。