题目
现在有 5 张扑克牌,其中 2 张是王牌(大小王),J、Q、K 各一张。将这 5 张牌排成一排,左端或者右端至少有一端王牌的排法有多少种?请说明计算方法
# coding:utf-8
C = ['大王','小王', 'J', 'Q', 'K']
def printC(n):
if(C[0] == '小王' or C[len(C)-1] == '大王' or
C[0] == '大王' or C[len(C)-1] == '小王'):
for i in range(0, n):
print(C[i], end = '\t')
print()
def swap(a, b):
t = C[a]
C[a] = C[b]
C[b] = t
def dfs(index, n):
# 如果交换到最后一个
if(index == n - 1):
printC(n)
return
else:
for i in range(index, n):
swap(i, index)
# 不断的和index后面的东西交换
dfs(index + 1, n)
# 交换回来
swap(i, index)
dfs(0, len(C))
input()
84种
手算的话
- | – | — | ---- | ----- |
---|---|---|---|---|
大王 | 1 | 2 | 3 | 4 |
小王 | 1 | 2 | 3 | 4 |
1 | 2 | 3 | 4 | 小王 |
1 | 2 | 3 | 4 | 大王 |
大王 | 1 | 2 | 3 | 小王 |
小王 | 1 | 2 | 3 | 大王 |
其中最后两行会在前四行里重复 次数为 3x2x1 + 3x2x1 = 12
前四行为 4x3x2x1 x4 = 96
96 - 12 = 84