手机九宫锁的组合问题

问题:安卓手机的屏幕锁是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          
           



                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值