下面大神的讨论我看得有点晕,所以我也来补充说明好了,假设原来顺序是 ABCDE
第一种情况:A选任意位置,有4种可能。
------------------------------------------------------------
第二种情况:AB互换位置。
表示从AB_ _ _变成了BA_ _ _
剩下的CDE只可能有BADEC跟BAECD两种可能
第三种情况:A选了B的位置,但是B不选A的位置。表示为 _ A B B B
因为不选A的位置只有三种可能,同时C在不选自己的位置加上两个位置已有人的情况下也有三种可能,在三个位置都决定的情况下剩下两个只能互换。
所以最终是4*(2+3*3)
l = list(range(5))
res = []
def fun(tmp, start, end):
if start == end:
res.append(tmp.copy())
return
for i in range(start, end):
tmp[start], tmp[i] = tmp[i], tmp[start]
fun(tmp, start+1, end)
tmp[start], tmp[i] = tmp[i], tmp[start]
fun(l, 0, 5)
num = 0
for e in res:
sign = False
for i in range(5):
if e[i] == i:
sign = True
break
if not sign:
num += 1
print(num)