麻将胡牌

2020-03-15  本文已影响0人  努力学习的CC

题目:雀魂启动

简述:根据输入(一个数组),判断抽取什么牌可以胡牌,前提是满足麻将的规则,一对眼+4对顺子(比如123,456)或者刻子(比如111,555)总共14张

基本思路:在我们打麻将的时候,胡牌之前我们需要检查牌型,用到的思路跟本题大体一致,这道题可以用递归的思路求解:分三种情况构建递归体,从数组最小的数值开始:

  1. 如果当前的牌可以当作眼,那我们看看去掉这对眼,剩下的牌型是否可以胡牌

  2. 如果当前的牌跟后面的两个牌组成刻子,那我们看看去掉这个顺子,剩下的牌型是否可以胡牌

  3. 如果在后面的牌中存在两张牌可以跟当前牌组成顺子,那我们看看去掉这个刻子,剩下的牌型是否可以胡牌

递归出口:当剩下的牌数为0时,则所有牌满足胡牌的标准

代码

def solve(hands):
    #4个顺子或者对
    #一对门将
    if not hands:
        return True
    hands.sort()
    if len(hands) == 1:
        return False
    if len(hands) == 2:
        return hands[0]==hands[1]
    
    count0 = hands.count(hands[0])
    if len(hands)%3!=0 and count0>=2 and solve(hands[2:])==True:
        return True
    if count0>=3 and solve(hands[3:])==True:
        return True
    if (hands[0]+1) in hands and (hands[0]+2) in hands:
        temp = hands[1:]
        temp.pop(temp.index(hands[0]+1))
        temp.pop(temp.index(hands[0]+2))
        return solve(temp)
    return False
if __name__=='__main__':
    hands = list(map(int,input().split()))
    rst = []
    for i in range(1,10):
        a = hands+[i]
        if a.count(i)>4:
            continue
        if solve(a):
            rst.append(i)
    rst.sort()
    print(' '.join(list(map(str,rst))))
上一篇下一篇

猜你喜欢

热点阅读