题目:雀魂启动
简述:根据输入(一个数组),判断抽取什么牌可以胡牌,前提是满足麻将的规则,一对眼+4对顺子(比如123,456)或者刻子(比如111,555)总共14张
基本思路:在我们打麻将的时候,胡牌之前我们需要检查牌型,用到的思路跟本题大体一致,这道题可以用递归的思路求解:分三种情况构建递归体,从数组最小的数值开始:
-
如果当前的牌可以当作眼,那我们看看去掉这对眼,剩下的牌型是否可以胡牌
-
如果当前的牌跟后面的两个牌组成刻子,那我们看看去掉这个顺子,剩下的牌型是否可以胡牌
-
如果在后面的牌中存在两张牌可以跟当前牌组成顺子,那我们看看去掉这个刻子,剩下的牌型是否可以胡牌
递归出口:当剩下的牌数为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))))
网友评论