跑胡子胡牌算法(带赖子、基于回溯算法)

跑胡子规则

  1. 跑胡子,小写“一”到“十”各4张共40张,大写“壹”到“拾”各4张共40张。
  2. 砌牌:跑胡子为3人同玩,庄家砌21张,其他方位砌20张,留19张在墩上。
  3. 一对牌:砌牌后,手中2个相同的牌为1对。
  4. 一坎牌:砌牌后,手中3个相同的牌为1坎。一坎牌不能拆散与其他牌组合。
  5. 一提牌:砌牌后,手中4个相同的牌为1提。一提牌不能拆散与其他牌组合。在进第一张牌之前,必须放到桌面示众。泸州地区叫一垅。
  6. 一句话:砌牌后,手中的牌依据规则组合成相连的三张,比如小四、五、六,称为一句话。另外二、七、十组合也称为一句话。泸州地区叫一列
  7. 绞牌:当1对大牌与1张相同的小牌,或者1对小牌与1张相同的大牌组合时,成为绞牌。如1对小九与1张大玖。

跑胡子从胡牌算法上跟麻将有许多相似之处,但比一般麻将规则更复杂一些:

1.几组牌(三张一组)+将(一对),跑胡子可以没将
2.都有:一句话(顺子)、提(杠)、坎(碰)、对(将),而跑胡子多一种绞牌及二七十特殊牌组
3.跑胡子还有最小胡息、翻数、红黑数等更复杂的算分逻辑

再讲讲回溯算法

  • 回溯算法,在我看来是一种用递归方式穷举所有解的算法,写的差的回溯算法跟穷举方法的效率差不多,甚至更差(代码可读性差、递归占用较多堆栈、更容易出错),但好的回溯算法结合了优秀的”截枝逻辑”,可以使算法效率提升非常多倍的同时,还能得到所有需要的解。总的来,当你想得到一种、多种甚至所有解的时候,使用穷举效率又太慢,这时回溯算法就是很好的选择。
  • 跑胡子,就很适合用回溯法求解,一是因为当它有赖子牌(万能牌)时,会出现很多种不同的解。二是由于它复杂的算分系统。让求最优解(得分最高)成为一件较难的问题。
  • 已实现c++版跑胡子胡牌算法,因算分规则复杂多变,本算法并不返回一个最优解,而是得到其中一个或所有解(指定最小胡息)。效率经测试:1ms以内。 https://github.com/pinorr/RunHuZi
  • 还实现了十三水的求所有解的算法,以后再分享吧~

你可能感兴趣的:(跑胡子胡牌算法(带赖子、基于回溯算法))