在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★ Given an Android 3x3 key lock screen and two integers m and n, where 1 ≤ m ≤ n ≤ 9, count the total number of unlock patterns of the Android lock screen, which consist of minimum of m keys and maximum n keys. Rules for a valid pattern:
Explanation: | 1 | 2 | 3 | | 4 | 5 | 6 | | 7 | 8 | 9 | Invalid move: Invalid move: Valid move: Valid move: Example: Credits: 给定一个android 3x3密钥锁屏和两个整数m和n,其中1≤m≤n≤9,计算android锁屏的解锁模式总数,该解锁模式由最小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 有效移动:6-5-4-1-9-2 第1-9行有效,因为它通过模式中选择的键5。 例子: 给定m=1,n=1,返回9。 信用: 特别感谢@elmirap添加此问题并创建所有测试用例。 Solution: 1 class Solution { 2 func numberOfPatterns(_ m:Int,_ n:Int) -> Int 3 { 4 return count(m, n, 0, 1, 1) 5 } 6 7 func count(_ m:Int,_ n:Int,_ used:Int,_ i1:Int,_ j1:Int) -> Int 8 { 9 var res:Int = m <= 0 ? 1 : 0 10 if n == 0 {return 1} 11 for i in 0..<3 12 { 13 for j in 0..<3 14 { 15 var I:Int = i1 + i 16 var J:Int = j1 + j 17 var used2:Int = used | 1 << (i * 3 + j) 18 let num1:Int = ((I % 2 == 0) || (J % 2 == 0) || (used2 == 0)) ? 1 : 0 19 let num2:Int = 1 << (I / 2 * 3 + J / 2) 20 if used2 > used && (num1 & num2) == 0 21 { 22 res += count(m - 1, n - 1, used2, i, j) 23 } 24 } 25 } 26 return res 27 } 28 } 点击:Playground测试 1 var sol = Solution() 2 print(sol.numberOfPatterns(1,1)) 3 //Print 9
|
请发表评论