打破麻将牌是不是检测麻将桌对麻将牌规格是不是程序机最有效的方法

如果只判断一手牌是不是满足3n+2形式的和牌其实实际应用最有效的方法就是利用递归的方法进行面子拆解。 原因是实际牌局中绝大部分的和牌进行面子拆解也就只有两彡种以内的拆解方法几乎不会出现让算法恶化到指数级复杂度的牌型,就像快速排序虽然最坏时间O(n^2)但在实际应用中是效果相当出色的排序算法手牌只有四面子一雀头,牌数很少即使用朴素的拆解法也效率很高,

这里给一个我写的python版判断和牌实现用于演示下算法实现:

 

***补充:以上代码实际是以「排列」的方式进行拆解,也就是说111123会拆解成111+123和123+111两种情况但这两种其实是一回事。如果要去重以「组合」嘚方式拆解,那就需要给递归函数再传入上一轮拆解的最小牌和类型(顺子、刻子、雀头等) ***补充2:上面的思路无法防止一般高、一色彡/四顺的重复顺子拆解,所以拆顺子那一步可以根据最小三张牌的数量一次拆2~4个顺子出来

当然以上算法只判断是否和牌,所以递归可以提前返回实际应用中由于要算番、算分,所以就不能提前返回了必须得把所有合法的面子组合都枚举出来算一下分数才行。

这种递归拆解的方法对于清一色牌效率会比较低特别是门前清的清一色。如果要提升清一色牌的效率那就上查表法吧。

表的key为该色数牌1~9各自的枚数value就是是否构成和牌。由于每种牌都有0~4枚五种可能总共就是5^9=1953125种组合,这个规模的表的内存消耗可以压缩到1MB以内所以完全可行,在程序运行前加载事先已经计算好的这张表之后直接查表即可。

我要回帖

更多关于 麻将桌对麻将牌规格 的文章

 

随机推荐