题目描述:
清一色是麻将番种之一,指由一种花色的序数牌组成的和牌.
数字1-9,每个数字最多有4张牌
我们不考虑具体花色,我们只看数字组合。
刻子:三张一样的牌;如: 111, 222, 333, …, 999
顺子:三张连续的牌;如: 123, 234, 345, …, 789
对子:两张相同的牌;如: 11, 22, 33, …, 99
需要实现一个程序,判断给定牌,是否可以和牌(胡牌)。
和牌要求:
- 麻将牌张数只能是 2, 5, 8, 11, 14
- 给定牌可以组合成,除1个对子以外其他都是刻子或顺子
举例: - “11” -> “11”, 1对子,可以和牌 - “11122233” -> “111”+“222”+“33”, 2刻子,1对子,可以
- “11223344567” -> “11”+“234”+“234”+“567”, 1对子,3顺子,可以
-> “123”+“123”+“44”+“567”, 另一种组合,也可以
输入描述:
合法C字符串,只包含’1’-‘9’,且已经按从小到大顺序排好;字符串长度不超过15。同一个数字最多出现4次,与实际相符。
输出描述:
C字符串,“yes"或者"no”
思路:输入字符合法性校验自然不用多说,本题使用递归求解,首先判断当前牌型是否包含顺子或者刻子,如果包含就去除这些字符,直到最后剩下两张牌时,再判断这两张牌是否相同,相同则可胡,不相同就胡不了了,具体实现看代码:
import copy
class ma_jiang():
def __init__(self, pai_str):
is_invalid_input = self.is_invalid_input(pai_str) #判断输入是否合法
if is_invalid_input != False:
print('Error Message: ' + is_invalid_input)
else:
print(self.if_win([int(i) for i in list(pai_str)]))
def is_invalid_input(self, par_str):
length = len(par_str)
temp_str = list(par_str)
temp_str.sort(