美文网首页
麻将胡牌

麻将胡牌

作者: 努力学习的CC | 来源:发表于2020-03-15 17:06 被阅读0次

    题目:雀魂启动

    简述:根据输入(一个数组),判断抽取什么牌可以胡牌,前提是满足麻将的规则,一对眼+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))))
    

    相关文章

      网友评论

          本文标题:麻将胡牌

          本文链接:https://www.haomeiwen.com/subject/kcfyehtx.html