问题:安卓手机的屏幕锁是3*3的9点矩阵。相邻的点可以用一条直线连接,但每个点不可以重复连接。如果必须连接4个点(含4个点)以上才是一个有效的形状,一共有多少种形状组合?
分析:将九个点按顺序标记1到9,找出长度大于等于4的全排列。其中有些组合是不可能出现的,例如不可能有1到3而不经过2的情况,除非是2已经在13之前出现过了,这种情况允许13越过2。 所以,问题可以分两步走:1, 找出长度4及以上的全排列组合; 2, 对每一个排列进行判断(是否包含不可能出现的情况,如13,17,19等。 里面再判断中间数字是否之前已经出现)
<pre name="code" class="python">from itertools import *
impossible={'13':'2', # create an impossible dict
'46':'5',
'79':'8',
'17':'4',
'28':'5',
'39':'6',
'19':'5',
'37':'5',
'31':'2',
'64':'5',
'97':'8',
'71':'4',
'82':'5',
'93':'6',
'91':'5',
'73':'5',
}
count=0
iterlist=chain(*(permutations('123456789',i) for i in range(4,10))) #generate all permutations of a list
for i in iterlist:
s=''.join(i)
for k,v in impossible.items():
ind=s.find(k)
if k in s and v not in s[:ind] :
break
else:
count+=1
print count