滑动解锁是智能手机一项常用的功能。你需要在3×3的点阵上,从任意一个点开始,反复移动到一个尚未经过的”相邻”的点。这些划过的点所组成的有向折线,如果与预设的折线在图案、方向上都一致,那么手机将解锁。两个点相邻当且仅当以这两个点为端点的线段上不存在尚未经过的点。此外,这条折线还需要至少经过4个点。
总结起来,有以下三个点:
1、最少四个点,最多九个点
2、可以画斜线,但不能跳点,除非中间点已经使用。比如:可以从1直接到6,不能1直接到3,但如果2已经使用,则可以直接从1到3。
3、不重复使用点
九宫格手势密码的可能性
为了方便,这里将点阵中的每个点用一个数字代替,1到9九个数字分别代表点阵中的一个点。这样,一个解锁手势可以对应到一个由1到9数字组成的字符串(该字符串中没有重复)。
去掉第二个限制条件,一种解锁手势正好对应一种1到9的排列。连接四个点的解锁手势的所有情况就是9选4的全排列,连接5个点的就是9选5的全排列,以此类推。
计算全排列的比较容易,接下来要解决的就是如何剔除那些不符合限制条件(手势的轨迹不能跨过一个还没有经过的节点)的手势。在3*3的点阵中,不符合条件的情况(也就是两个点的连接过程中跨过点的情况)比较有限,这里我们将其全部列出。
'13': '2', '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'
上面可以看出,这种情况主要有16中(每种用一个k-v对来表示)。每一对列出了跨过点的情况,比如13连接会跨过2。
下面通过程序用全排列的思路列举出所有可能的手势情况,用一个数字字符串表示,并剔除掉其中不符合条件。剔除的思路很简单:对于每一种k-v对表示的跨过点的情况,如果k和v在表示手势的字符串中出现,并且没有出现在k出现的位置之前,那么这种情况应该被剔除。
3、进一步分析
下面稍微修改下程序,这些手势情况在不同的长度中是如何分布的?
from itertools import chain, permutations
impossible = {'13': '2', '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'}
def counts_n(n):
iterlst = permutations('123456789', n)
count = 0
for i in iterlst:
stri = ''.join(i)
for k, v in impossible.items():
if k in stri and v not in stri[:stri.find(k)]:
break
else:
count += 1
return count
sum = 0
print("len num sum")
for i in range(4,10):
temp = counts_n(i)
sum = sum + temp
print(str(i)+" "+str(temp)+" "+str(sum))
总结
最难的几种九宫格手势密码
坊间流传了一些最古怪的九宫格手势密码,是网友们从2000多个九宫格图案中,评选出来的13个最难九宫格图案,这些九宫格图案不但是最复杂而且是最具美感的,脑洞大开的朋友们可以试一试,看看你会了几个?
看完以后,也基本石化了
ok,今天的内容就这样全部结束了,喜欢能看见星星的晚上,仿佛睡过一觉醒来后什么都可以重新开始。
会员全站资源免费获取,点击查看会员权益