需要满足的要求有:
至少经过四个点;
不能重复经过同一个点;
路径上的中间点不能跳过(如从1到3一定会经过2);
如果中间的点是之前已经用过的,那么这个点就可以被跳过(如213,因为2已经被用过,1就可以越过2与3连接,132是不允许的)。

作者:linkwun
链接:https://www.zhihu.com/question/24905007/answer/29414497
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

from itertools import chain, permutationsimpossible = {'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():iterlst = chain(*(permutations('123456789', i) for i in range(4, 10)))count = 0for i in iterlst:stri = ''.join(i)for k, v in impossible.items():if k in stri and v not in stri[:stri.find(k)]:breakelse:count += 1return countprint(counts())#389112

我用python写了段代码,先计算出所有大于四个数字的所有排列组合,然后从中剃除穿过中间那个数字的组合,剩下的既为符合要求的代码。
例如13组合是不可能存在的,因为它会穿过2,19组合也不可能存在,因为它会穿过5,总共有16个这样的组合。
但是假如中间这个数字已经用过了,是可以穿过的,比如213,2已经用过了,1是可以穿过2与3连接的。
如此筛选以后,就得到正确答案389112了。

以下两段codes可以看做是等价的,只是chain的效率更高:

    iterlst = chain(*(permutations('123456789', i) for i in range(4, 10)))count = 0for i in iterlst:

for permutation in ((permutations('123456789', i) for i in range(4, 10))):for item in permutation:print(item)

后记:上面的解法并不够通用,通用的解法就是回溯。回溯需要注意两点:

1. 回溯过程中无非考虑相邻两个节点之间的关系,同时满足两个条件为合法:

a. 并没有访问过

b. (存在13这种跨越,但是2已经被访问过了)或者不存在13这种跨越,这些跨越打个表就好

2. 利用对称性优化

最后贴一下leetcode 的题目和codes:

----------------------------------------------

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:

Input: m = 1, n = 1
Output: 9

----------------------------------------------

class Solution:def numberOfPatterns(self, m, n):cross = {(1,3):2,(3,1):2,(1,7):4,(7,1):4,(3,9):6,(9,3):6,(7,9):8,(9,7):8,(1,9):5,(9,1):5,(2,8):5,(8,2):5,(3,7):5,(7,3):5,(4,6):5,(6,4):5}visited = set()def dfs(x, k):if not k: return 1visited.add(x)cnt = sum(dfs(y, k-1) for y in range(1,10) if y not in visited and ((x,y) not in cross or ((x,y) in cross and cross[(x,y)] in visited)))visited.discard(x)return cntreturn sum(dfs(1,k)*4 + dfs(2,k)*4 + dfs(5,k) for k in range(m-1, n))

手机的九宫格图案解锁总共能绘出多少种图案?LeetCode 351. Android Unlock Patterns相关推荐

  1. 用C语言计算手机的九宫格图案解锁总共能绘出多少种图案

    之前在学校的一个社团招募大一新生时,给出了这个题目: 用程序编写完成九宫格图案解锁总共能绘出多少种图案 需要满足的要求有: 1.至少经过四个点: 2.不能重复经过同一个点: 3.路径上的中间点不能跳过 ...

  2. 手机的九宫格图案解锁总共能绘出多少种图案?(hiho模拟面试题2 - google在线技术笔试模拟)

    滑动解锁是智能手机一项常用的功能.你需要在3x3的点阵上,从任意一个点开始,反复移动到一个尚未经过的"相邻"的点.这些划过的点所组成的有向折线,如果与预设的折线在图案.方向上都一致 ...

  3. [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 ...

  4. 用c语言画出一个五角星图案,用c语言画出一个五角星图案.doc

    用c语言画出一个五角星图案 感觉上五角星和六角星 的思路差不多,所以就不做重复劳动啦~嘿嘿O(∩_∩)O~ 以下公布一个非本人的代码,虽然感觉这个五角星画的不是很"正",但总体感觉 ...

  5. Appium九宫格滑动解锁研究

    九宫格滑动解锁,目前发现有两种一种是每个可点的方格都是一个imageview,九宫格则对应有9个imageview,此类解锁已有前人研究解决了,可以参照tobecrazy的博客 今天我要说的是另一种, ...

  6. Flex【原创】模拟Android图案解锁

    Flex 实现Android图案解锁功能 看见Andorid系统里面有图案解锁的功能,试想能用Flex的移动开发实现吗?答案是:完全可以! 环境:Flex 4.6(air3.2) 先看我的包结构: 第 ...

  7. 九宫锁屏图案有多少种c语言编程,手机九宫格图案解锁问题,编程高手戳进来!...

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 数学吧里看到的一个有趣问题,题目描述很简单: 求手机九宫格图案解锁一共有多少种答案.规则大家应该都知道,至少连四个点,最多连九个点,一条直线上的三个点只有 ...

  8. Android之高仿手机QQ图案解锁

    本文源码(utf-8编码):http://download.csdn.net/detail/weidi1989/6628211 ps:请不要再问我,为什么导入之后会乱码了. 其实,代码基本上都是从原生 ...

  9. 手机9宫格图案解锁方法总数计算

    图案解锁是智能手机一项常用的功能.你需要在3x3的点阵上,从任意一个点开始,反复移动到一个尚未经过的"相邻"的点.这些划过的点所组成的有向折线,如果与预设的折线在图案.方向上都一致 ...

最新文章

  1. Project Life Cycle
  2. 《如何更改其他程序ListView控件中某个Item的内容》
  3. 主机连接wifi,如何设置虚拟机上网方式
  4. 工作中的注意事项、细节
  5. libmodbus 封装成dll_Windows Visual Studio 2017 编译 libmodbus
  6. 13位时间戳单位为毫秒,10位字符串单位为秒。时间戳转换日期数字格式100%全乎
  7. 课堂派(SpringBoot+Vue)
  8. ElasticSearch 技术分析与实战 读后感
  9. 亦舒的话,我的感触...
  10. 两阶段市场投标策略。 电力市场程序。 日前日内竞价 提出了日前电力市场和实时电力市场下充电站的投标策略
  11. Blackhat 2017Defcon 25学习笔记
  12. 数商云工业制造行业B2B电商平台解决方案
  13. Google Map API v3 - 设置边界和中心
  14. gdb 笔记(02)— gdb 调试执行(启动调试、添加参数、附加到进程、调试 core 文件)
  15. error怎么开机 fan_电脑开机黑屏提示CPU Fan Error怎么解决?
  16. Jetson Nano Nano 2G 官方镜像下载地址
  17. linux系统常用命令
  18. Matlab重新激活
  19. 《数字电子技术课程设计》课程笔记(五)————调试总结
  20. 面向初学者的 MQL4 语言系列之2——MQL4语言入门深入

热门文章

  1. android 界面大小设置在哪里,移动应用界面设计的尺寸设置及规范
  2. winmail 数据库设置_Windows - 2003下搭建邮件服务器教程和使用 - Winmail - Server - 轻松架设邮件服务器 - 图文...
  3. Android基础教程(十)build.gradle文件
  4. 三极管的基础知识(上)
  5. html圆角边框背景颜色,CSS之圆角边框渐变的实现
  6. 给openWrt安装管理界面中文包,顺带安装新界面风格,亲测有效
  7. Vmware安装OpenWrt
  8. 姜思达和机器人_姜思达爱上人工智能是怎么回事?
  9. ABCD……组成菱形
  10. dhcp服务器显示不启用,如何启用dhcp服务器