[Swift]LeetCode351. 安卓解锁模式 $ Android Unlock Patterns

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:

  1. Each pattern must connect at least m keys and at most n keys.
  2. All the keys must be distinct.
  3. If the line connecting two consecutive keys in the pattern passes through any other keys, the other keys must have previously selected in the pattern. No jumps through non selected key is allowed.
  4. The order of keys used matters.

Explanation:

| 1 | 2 | 3 |
| 4 | 5 | 6 |
| 7 | 8 | 9 |

Invalid move: 4 - 1 - 3 - 6 
Line 1 - 3 passes through key 2 which had not been selected in the pattern.

Invalid move: 4 - 1 - 9 - 2
Line 1 - 9 passes through key 5 which had not been selected in the pattern.

Valid move: 2 - 4 - 1 - 3 - 6
Line 1 - 3 is valid because it passes through key 2, which had been selected in the pattern

Valid move: 6 - 5 - 4 - 1 - 9 - 2
Line 1 - 9 is valid because it passes through key 5, which had been selected in the pattern.

Example:
Given m = 1, n = 1, return 9.

Credits:
Special thanks to @elmirap for adding this problem and creating all test cases.



给定一个android 3x3密钥锁屏和两个整数m和n,其中1≤m≤n≤9,计算android锁屏的解锁模式总数,该解锁模式由最小M个密钥和最大N个密钥组成。

有效模式的规则:

  1. 每个模式必须连接至少M个键和最多N个键。
  2. 所有键必须是不同的。
  3. 如果连接模式中两个连续键的线通过任何其他键,则其他键必须事先在模式中选择。不允许跳过未选定的键。
  4. 钥匙的使用顺序很重要。

说明:

| 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

原文地址:https://www.cnblogs.com/strengthen/p/10740374.html

时间: 2024-11-13 09:11:37

[Swift]LeetCode351. 安卓解锁模式 $ Android Unlock Patterns的相关文章

[LeetCode] Android Unlock Patterns 安卓解锁模式

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: Each pattern m

Leetcode: Android Unlock Patterns

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: Each pattern m

Android Unlock Patterns

public class Solution { private boolean[][] visited = new boolean[3][3]; private int m; private int n; public int numberOfPatterns(int m, int n) { if (n == 0 || m > n) { return 0; } int result = 0; this.m = m; this.n = n; for (int i = 0; i < 3; i++)

【转载】谷歌酝酿将苹果Swift作为安卓APP主要开发语言

TNW中文站 4月8日报道 安卓操作系统的软件开发语言是Java,而在过去几年中,有关Java的版权,谷歌(微博)和甲骨文之间发生了长期的诉讼.最新外媒消息称,谷歌正在考虑将苹果开发的Swift作为未来安卓软件开发的“一级”语言,此外Facebook.Uber等公司也开始越来越重视Swift的使用. 据美国科技新闻网站TheNextWeb引述知情人士报道,此前苹果Swift转变为开放源码语言,而谷歌.Facebook.和Uber三家公司的代表曾经在英国伦敦开会,专门讨论Swift语言,谷歌决定逐

Android Design Patterns

出版时间:2013 下载地址:百度网盘 内容简介: Master the challenges of Android user interface development with these sample patterns With Android 4, Google brings the full power of its Android OS to both smartphone and tablet computing. Designing effective user interfac

安卓表格布局android:collapseColumns,android:shrinkColumns和stretchColumn

TableLayout的行数由开发人员直接指定,即有多少个TableRow对象(或View控件),就有多少行. TableLayout的列数等于含有最多子控件的TableRow的列数.如第一TableRow含2个子控件,第二个TableRow含3个,第三个TableRow含4个,那么该TableLayout的列数为4. TableLayout可设置的属性包括全局属性及单元格属性. 1.全局属性也即列属性,有以下3个参数: android:stretchColumns    设置可伸展的列.该列可

恩布900手机客服,安卓版本号Entboost Android 1.0 正式公布

恩布900手机客服,安卓版本号Entboost Android 1.0正式公布,支持一行代码在安卓手机实如今线客服的功能,支持文本.表情,图片,语音和离线消息等. ENTBOOST是跨平台.跨应用的实时通讯开放平台,恩布网络致力于提供跨终端.跨应用的信息实时互通开源解决方式: 开源项目地址:http://www.oschina.net/p/entboost 项目下载地址:http://git.oschina.net/akee/entboost 恩布开发文档中心:http://doc.entboo

安卓开发解决android.os.NetworkOnMainThreadException异常方法(主线程不能直接调用webservice)

安卓开发解决android.os.NetworkOnMainThreadException异常方法 2013-01-07 14:01:04|  分类: 技术 |  标签:安卓  技术  java  |举报|字号 订阅 在android 2.3上访问网络的方法,在android 4.0上运行时报android.os.NetworkOnMainThreadException异常,主要问题在于4.0中访问网络不能在主线程中进行,有两个方法可以解决.第一种是在主线程中增加如下代码[不推荐]: // 详见

初识安卓小程序(Android短信发送器)

首先,先创建一个安卓项目(我的版本是4.4.2的),名字为"短信发送器" 然后在res文件夹下找到layout文件夹,找到activity_main.xml或fragment_main.xml,在里面输入或拖拽按钮 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tool