手机九宫锁的组合问题

问题:安卓手机的屏幕锁是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          
           
    原文作者:九宫格问题
    原文地址: https://blog.csdn.net/zhu418766417/article/details/38777957
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞