###### tags: `程式設計`
# 第十一週
## 麻將
```python=
majon = ['一萬','二萬','三萬','四萬',
'五萬','六萬','七萬','八萬',
'九萬','一筒','二筒','三筒',
'四筒','五筒','六筒','七筒',
'八筒','九筒','一條','二條',
'三條','四條','五條','六條',
'七條','八條','九條',
'東','南','西','北','中','發','白']
# 上課筆記(好像有錯但我看不太出來)
## 麻將一共有34種牌
## 1~9萬
## 1~9筒
## 1~9條
## 東南西北中發白
## 台灣麻將一開始發16張牌,摸一張變17張牌,若這17張牌可以"組合"成如下即可"胡牌"
## (1)有麻將,意指兩張一樣的牌
## (2)其餘15張,可以組成5組的"刻"(3張一樣的)或"順"(萬筒條連號)
## 題目是,給34介於0~4的int,且其總合為17,寫一函數判斷能否胡牌
## 0~8 表示1~9萬
## 9~17 表示1~9筒
## 18~26 表示1~9條
## 27~33 表示東南西北中發白
## 如何判斷是否為"萬筒條"? x < 27
## 已知萬筒條,是哪一種? x // 9
## 已知萬筒條,多大? x % 9
## cards : 每一種牌的個數
## needMJ : 需不需要選麻將
## n : 還有幾張要選
def myCanHu(cards, n) :
if n == 0 :
return True # 胡了!
result = False
for i in range(34) :
# 麻將
if n % 3 != 0 and cards[i] >= 2 : # 沒選過麻將,且這張牌可以當麻將
remain = cards[::] # 複製一份給同學,不要讓同學動到我手上的牌
remain[i] -= 2 # 給同學的牌要扣掉兩張當麻將的
result = myCanHu(remain, n-2) # 問同學剩下的可以胡嗎?
if result == True : # 任一種組合可以胡就好
return True
# 刻
if cards[i] >= 3 :
remain = cards[::]
remain[i] -= 3
if myCanHu(remain, n-3) :
result = True
# 順
if i<27 and i%9<7 and cards[i]>=1 and cards[i+1]>=1 and cards[i+2]>=1 :
remain = cards[::]
remain[i] -= 1
remain[i+1] -= 1
remain[i+2] -= 1
if myCanHu(remain, n-3) :
result = True
return result
def canHu(cards) :
return myCanHu(cards, 17)
# return True if 可胡
# false otherwise
def main() :
majon = ['一萬','二萬','三萬','四萬','五萬','六萬','七萬','八萬','九萬','一筒','二筒','三筒','四筒','五筒','六筒','七筒','八筒','九筒','一條','二條','三條','四條','五條','六條','七條','八條','九條','東','南','西','北','中','發','白']
cards = list(map(int, input().split()))
print(canHu(cards))
if __name__ == '__main__' :
main()
```