手機九宮鎖的組合問題

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



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章