1. 問題描述:
小明被劫持到X賭城,被迫與其他3人玩牌。 一副撲克牌(去掉大小王牌,共52張),均勻發給4個人,每個人13張。 這時,小明腦子裡突然冒出一個問題: 如果不考慮花色,隻考慮點數,也不考慮自己得到的牌的先後順序 自己手裡能拿到的初始牌型組合一共有多少種呢?
輸出
請輸出該整數,不要輸出任何多餘的内容或說明文字。
來源:http://oj.ecustacm.cn/problem.php?id=1253
2. 思路分析:
① 分析題目可以知道這道題目其實一個排列組合問題,需要嘗試所有排列組合方案的可能性,根據這個特點我們可以使用遞歸解決(遞歸可以搜尋的可能性),但是這道題目有一個限制條件是隻考慮點數,不考慮牌的順序,是以在求解的時候不能夠像求解全排列那樣對于不同的排序方式計算為不同的方案,其實這道題目可以轉換為求解每一個數字出現的次數就可以避免牌的出現順序不同被計數的問題,有的時候換一種思考問題的方式可能會使問題的處理變得簡單一點,答案為:3598180
② 除了使用遞歸的方法,使用for循環也是可以的,與遞歸的思路也是一樣的,在for循環(13層的for循環)中使用一個清單來控制各個數字出現的次數,如果次數等于13那麼計數加1,最終傳回這個結果即可
3. 代碼如下:
res = 0
# 第一個count參數用來計算當目前為止出現了多少張牌了, 第二個step參數是為了控制走的步數, 因為牌的種類是13是以步數最多在13次
def dfs(count: int, step: int):
global res
if count > 13 or step > 13: return
if count == 13:
res += 1
return
for i in range(5):
dfs(count + i, step + 1)
if __name__ == '__main__':
dfs(0, 0)
print(res)