一个好玩的小游戏——麻神之战

题目:

一种新的麻将,只留下一种花色,并且除去了一些特殊和牌方式(例如七对子等)。规则如下:

  1. 共有36张牌,每张牌是1~9。每个数字4张牌。

  2. 你手里有其中的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)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值