题目:
一种新的麻将,只留下一种花色,并且除去了一些特殊和牌方式(例如七对子等)。规则如下:
-
共有36张牌,每张牌是1~9。每个数字4张牌。
-
你手里有其中的14张牌,如果这14张牌满足如下条件,即算作和牌:
14张牌中有2张相同数字的牌,称为雀头。 除去上述2张牌,剩下12张牌可以组成4个顺子或刻子。顺子为递增的连续3个数字牌(如234,567等),刻子为3个相同的数字牌(如:111,777)
1 1 1 2 2 2 6 6 6 7 7 7 9 9 可以组成1,2,6,7的4个刻子和9的雀头,可以和牌
1 1 1 1 2 2 3 3 5 6 7 7 8 9 用1做雀头,组成123,123,567,789的四个顺子,可以和牌;
1 1 1 2 2 2 3 3 3 5 6 7 7 9 无论用1 2 3 7哪个做雀头,都无法和牌
现在,小包从36张牌中抽取了13张牌,他想知道在剩下的23张中取一张牌,取到哪几种数字可以和牌。
输入描述:输入只有一行,包含13个数组,用空格分隔,每个数字在1~9之间,保证同种数字最多出现4次。
输出描述:输出同样是一行,包含1个或以上的数字。代表他再次取到哪种数字可以和牌。若满足条件的有多种,请按从小到大的顺序输出。若无法和牌,请输出一个数字0。 分析:
最多有9种抽牌方式能让小包和牌,判断每种抽牌方式是否和牌即可。问题转化为判断14张牌是否和牌。
判断是否和牌时,当有顺子或刻子,取出这些牌,然后判断剩下的牌是不是能组成顺子或刻子。递归问题。 代码:
a = input().split()
alist = [int(x) for x in a]
#alist = [1, 1, 1, 2, 2, 2, 6, 6, 6, 7, 7, 7, 9]
He_kinds = []
# 判断是否和牌
def isHe(cardlist):
l = len(cardlist)
if l == 0:
return True
count0 = cardlist.count(cardlist[0])
# 没出现过雀头,且第一个数字出现的次数 >= 2,且去掉雀头剩下的能组成和牌
if l % 3 != 0 and count0 >= 2 and isHe(cardlist[2:]) == True:
return True
# 如果第一个数字出现次数 >= 3,且去掉这个刻子后剩下的能和牌
if count0 >= 3 and isHe(cardlist[3:]) == True:
return True
# 如果存在顺子,且移除顺子后剩下的能和牌
if cardlist[0]+1 in cardlist and cardlist[0]+2 in cardlist:
c_cardlist = cardlist[1:]
c_cardlist.remove(cardlist[0]+1)
c_cardlist.remove(cardlist[0]+2)
if isHe(c_cardlist) == True:
return True
# 以上条件都不满足,则不能和牌
return False
# 最多有9种抽牌方法可以和牌,计算每一种能不能和牌
for i in range(1, 10):
if isHe(sorted(alist + [i])) == True: # 如果这种抽牌方式可以和牌
He_kinds.append(i) # 加入和牌类型列表
print(len(He_kinds)) # 输入和牌方式有多少种
#print(He_kinds)