351-Android-Unlock-Patterns
Last updated
Was this helpful?
Last updated
Was this helpful?
我们都知道安卓有个手势解锁的界面,是一个 3 x 3 的点所绘制出来的网格。 给你两个整数,分别为 m 和 n,其中 1 ≤ m ≤ n ≤ 9,那么请你统计一下有多少种解锁手势,是至少需要经过 m 个点,但是最多经过不超过 n 个点的。
先来了解下什么是一个有效的安卓解锁手势: 每一个解锁手势必须至少经过 m 个点、最多经过 n 个点。 解锁手势里不能设置经过重复的点。 假如手势中有两个点是顺序经过的,那么这两个点的手势轨迹之间是绝对不能跨过任何未被经过的点。 经过点的顺序不同则表示为不同的解锁手势。
解释: | 1 | 2 | 3 | | 4 | 5 | 6 | | 7 | 8 | 9 |
无效手势:4 - 1 - 3 - 6 连接点 1 和点 3 时经过了未被连接过的 2 号点。
无效手势:4 - 1 - 9 - 2 连接点 1 和点 9 时经过了未被连接过的 5 号点。
有效手势:2 - 4 - 1 - 3 - 6 连接点 1 和点 3 是有效的,因为虽然它经过了点 2 ,但是点 2 在该手势中之前已经被连过了。
有效手势:6 - 5 - 4 - 1 - 9 - 2 连接点 1 和点 9 是有效的,因为虽然它经过了按键 5 ,但是点 5 在该手势中之前已经被连过了。
测试用例:
示例: 输入: m = 1,n = 1 输出: 9
键盘上的9个键能够产生的连线情况可以分为两种:
两个键之间不会经过第三个键
两个键之间会经过第三个键
其中会经过第三个键的连线总共有8中小情况:
(1,3)、(3,9)、(,9,7)、(7,1)
(2,8)、(4,6)、(1,9)、(3,7)
注意每种情况实际是两条线,上面第二类的连线都会经过键5。那么我们就可以把按键分为三类,如下图所示:
1、3、7、9为一组。因为这四个键都在边角。
2、4、6、8为一组,因为这四个键都在中间
5单独为一组
对于一个键x,它可以选择剩下的八个键作为下一个目的地y,但是如果(x,y)之间有第三个键,就需要判断这第三个键是否已经被访问过。
并且这9个键都可以作为路径起始点,但是由于1、3、7、9是一类点,2、4、6、8是一类点。5是一类点。所以我们只需要求从键1开始出发的路径总数然后乘四即可。对于键2也是类似。最后单独求从键5出发的路径数。
不看答案我能会做?