問題:安卓手機的屏幕鎖是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