麻将胡牌判定的判定算法
问题背景 :
简化了麻将规则,给定[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: 可以