麻将胡牌判定的判定算法

麻将胡牌判定的判定算法

问题背景 :
简化了麻将规则,给定[1s-9s],[1b-9b],[1t-9t]一共27种牌,每种牌都有4张。需要判断给定的牌是不是胡牌。

胡牌的定义为:
14张牌里面由一个对子,四个坎组成。其中对子代表两张一样的牌,坎代表三张一样的牌,或者三张连续的牌(连续指: 1s,2s,3s | 4t,5t,6t) 

举例:
1s,1s,2t,3t,4t,2t,3t,4t,6b,7b,8b,5s,5s,5s就是胡牌。


思路1 搜索+剪枝:
    step0:将牌排序

    step1: 枚举所有的牌,假设当前枚举到的牌记作 {x},然后尝试获取第2个x(/*如果没有则失败*/). 同时将2个x从手牌集合去除

    step2: 枚举所有的顺子(连续的牌).枚举顺子实际上是枚举顺子中最小的那个元素y,因为其他元素可以通过y+1,y+2来表示。并且从集合里面取出y,y+1,y+2;
    为了保持搜索的时候做到 /*不重不漏*/,从顺子里面最小的开始搜索,也就是说,这一次枚举了顺子 y+1,y+2,y+3,那么在接下来的递归搜索里,枚举的顺子最小元素一定从 {大于等于} y的元素开始;
    注意,如果y之后没有y+2了,那么就跳过(比如7s,8s,9s,1t,2t...),直接跳过8s,9s;

    step3: 不停搜索顺子,直到
        case1:已经有四个了,当前状态已经满足,直接返回。
        case2: 已经没有顺子了,但是还没有四个坎,于是需要寻找三个一样的元素。判定剩下的牌是不是满足条件很简单,这里就不多言了。

    优化1: 可以
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值