1253
小明被劫持到X赌城,被迫与其他3人玩牌。
一副扑克牌(去掉大小王牌,共52张),均匀发给4个人,每个人13张。
这时,小明脑子里突然冒出一个问题:
如果不考虑花色,只考虑点数,也不考虑自己得到的牌的先后顺序
自己手里能拿到的初始牌型组合一共有多少种呢?
输出
请输出该整数,不要输出任何多余的内容或说明文字。
注意
- J Q K相当于11、12、13,即是扑克为1-13点数,每种4张
- python 在全局变量作为引用不需要添加关键字global,无论是列表,还是变量;
修改全局变量,需要在函数中修改,需要添加global,避免歧义;
特别地,列表、字典等只是修改其中元素的值,可以不需要global。
算法
python v1.0:
- 首先采用枚举法,分单个点数可能有1,2,3,4张牌分别多少,共有39种分堆
- 利用函数算组合,让后求和
- zh(),是一个求组合C的函数
单个计算便是:zh(a,13)zh(b,13-a)zh(c, 13-a-b)*zh(d, 13-a-b-c)
最后累加求和即可。
python v2.0:
- 采用dfs(深度优先搜索方法),往前搜索13层即可,每层可能选择0,1,2,3,4张牌
- 设置好出口条件,以dfs(0,0)开始。dns(0,1) 表示当前在拿第一层的牌,一张
题解
python v1.0:
from functools import reduce
def zh(u, d):#计算组合
if u == 0:
return 1
if u>d//2:
u = d - u
fenmu = reduce(multiply, [i for i in range(1, u+1)],1)
# print(fenmu)
fenzi = reduce(multiply, [i for i in range(d, d-u,-1)],1)
# print(fenzi)
return fenzi//fenmu
def accumulate(data):
a, b, c, d = data
mul = zh(a,13)*zh(b,13-a)*zh(c, 13-a-b)*zh(d, 13-a-b-c)
return mul
multiply = lambda a, b : a*b
# print(zh(24,25))
# count = 0
array = []
for i in range(14):
for j in range(7):
for k in range(5):
s = 13 - (1*i + 2*j + 3*k)
if s >= 0 and s%4 == 0:
# count = count + 1
array.append([i, j, k, int(s/4)])
# print(len(array))
sum = 0
for i in range(len(array)):
#print(array[i])
sum += accumulate(array[i])
#print()
print(sum)
结果:
print('3598180')
/**************************************************************
Problem: 1253
User: yanshanbei
Language: Python
Result: 正确
Time:21 ms
Memory:26796 kb
****************************************************************/
python v2.0:
def dns(a, b):
# dns(0,1) 表示当前在拿第一层的牌,一张
if a == 13 and b <= 13:
global res# 修改全局变量声明
res = res + 1
return
if a > 13 or b > 13:
return
for i in range(4+1):
dns(a + i, b + 1)
res = 0
dns(0,0)
print(res)