b_zj_雀魂啟動(分類討論的回溯)
阿新 • • 發佈:2020-12-21
給定13張牌,問加入1~9中的任意一張牌後,能否達成和牌(滿足以下兩個條件):
- 14張牌中有2張相同數字的牌,稱為雀頭。
- 除去上述2張牌,剩下12張牌可以組成4個順子或刻子。順子的意思是遞增的連續3個數字牌(例如234,567等),刻子的意思是相同數字的3個數字牌(例如111,777)
思路:暴力刪除即可,更優的做法是使用計數來實現邏輯刪除
def dfs(A): if len(A)==2 and A[0]==A[1]: return 1 for i in range(len(A)-4): if A[i]==A[i+4]: #統一種類的牌不能超過4張 return 0 for i in range(len(A)-2): # 刻子 t=A[i] if t==A[i+2]: B=A.copy() B.remove(t) B.remove(t) B.remove(t) if dfs(B): return 1 # 順子 elif (t in A) and (t+1 in A) and (t+2 in A): B=A.copy() B.remove(t) B.remove(t+1) B.remove(t+2) if dfs(B): return 1 return 0 A,ans=list(map(int, input().split())),[] for i in range(1,10): cards=A.copy() cards.append(i) cards.sort() if dfs(cards): ans.append(i) ans=' '.join(str(x) for x in sorted(ans)) if ans else '0' print(ans)