• 关于麻将的算法构想


    麻将牌型主是AA,AAA,AAAA,ABC的组合构成胡牌,可以把牌分为明牌和手牌,明牌是指杠,吃,碰之后的牌,手牌指未露出来的牌,听牌只需要算手牌即可。

    听牌可以分为有对将,其它为圆句,只留一个需要圆句,吃牌胡,或者碰牌胡。

    如果无对将,则需所有为圆句和一张单牌吊将。

    方法一:

    先取一对将,再把剩下的牌递归找整句,直到只剩两张牌,算出缺口牌即为听的牌。中间任意一步失败也该组合失败。

    先找整句,剩下的牌再找整句,如此递归,只到只剩一张,此牌为听牌。任意一步失败该组合也失败。

    算法缺陷:重复的组合很多,例如AAABBBC,BBBAAAC其实是一样的,却重复递归计算了。

    方法二:

    思路大体上与方法一一样,改进点就是要减少重复的组合,找到所有的对,句去组合,再判断。

    算法缺陷:所有的对,句组合(cmn)时往往会也有少量重复计算,原因是句,对会有交叉,另外还要计算交叉组合是否与原牌相符合,计算量也不小。在多数情况下计算量还是要好于方法一。

    以上两种算法均已js实现。

    如何处理交叉问题,减少无效组合计算?这确实有点难度,待深度思考。

    下载地址

  • 相关阅读:
    SpringBoot-14-MyBatis预热篇,MySQL小结
    SpringBoot-13-插曲之Node文件重命名+自动生成json对象
    八月十九风雨大作
    诉世书
    《仪式》
    珊瑚墓地
    新生
    《应龙》
    《枝·你是树的狂舞》
    golang中使用etcd
  • 原文地址:https://www.cnblogs.com/kingge/p/mahjong.html
Copyright © 2020-2023  润新知