lotus

贵有恒何必三更眠五更起 最无益只怕一日曝十日寒

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理
  1846 随笔 :: 0 文章 :: 109 评论 :: 288万 阅读

1. 题目

读题

[编程题]手机屏幕解锁模式 

 https://www.nowcoder.com/exam/test/71158686/detail?pid=22390442&examPageSource=Search

手机屏幕解锁模式
现有一个 3x3 规格的 Android 智能手机锁屏程序和两个正整数 m 和 n ,请计算出使用最少m 个键和最多 n个键可以解锁该屏幕的所有有效模式总数。

其中有效模式是指:

1、每个模式必须连接至少m个键和最多n个键;

2、所有的键都必须是不同的;

3、如果在模式中连接两个连续键的行通过任何其他键,则其他键必须在模式中选择,不允许跳过非选择键(如图);

4、顺序相关,单键有效(这里可能跟部分手机不同)。

输入:m,n

代表允许解锁的最少m个键和最多n个键
输出:满足m和n个键数的所有有效模式的总数

考查点

 

2. 解法

思路

 

这道题的解答思路是这样的:

  • 首先,我们需要定义一个3x3的矩阵,表示手机屏幕上的9个键,每个键有一个编号,从1到9;
  • 然后,我们需要定义一个数组或者一个哈希表,存放不可直接相连的两个点,例如1和3,2和8等;
  • 接着,我们需要定义一个递归函数,用来遍历所有可能的模式,从每个点出发,按照一定的规则选择下一个点,直到达到m个点或者没有可选的点为止;
  • 在选择下一个点的时候,我们需要判断以下几个条件:
    • 下一个点不能是已经选择过的点;
    • 下一个点不能越界;
    • 如果下一个点和当前点之间有一个中间点,并且中间点没有被选择过,则不能跳过中间点;
  • 每次选择完一个点后,我们需要将该点加入到当前的模式中,并更新计数器;
  • 当达到m个点或者没有可选的点时,我们需要判断当前的模式是否有效,如果有效,则将其加入到结果集中,并返回;
  • 最后,我们需要对所有可能的模式进行去重,并返回结果集的大小。

参考一下:

  • vivo2020届春季校园招聘手机屏幕解锁模式:这篇博客介绍了一种方法,是算所有可能性包括无效的模式再减去无效的模式,参考方法是直接计算所有有效的模式。作者给出了Java代码和注释。
  • [编程题]手机屏幕解锁模式:这篇博客介绍了另一种方法,是将锁屏看成1~9的九个点组成,采用深度优先遍历算法,其中data存放的是不可直接相连的两个点,但是经过发现如果遍历过两点平均数,那么这两个点可以直接相连(例如,点 1 和点 3 本来是不能直接相连的,但是如果点 (1+ 3)/2 = 2 被遍历过的化,那么点 1 和点 3 可以直接相连)。作者给出了Java代码和输出结果。
  • DFS----手机屏幕解锁模式:这篇博客也介绍了深度优先遍历算法,但是没有给出具体的代码实现。

 

代码逻辑

 

具体实现

 

 

3. 总结

posted on   白露~  阅读(38)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
历史上的今天:
2022-07-19 MySql保留两位小数
2022-07-19 MySQL保留2位小数
2022-07-19 MySql数据库中null值与其他值的比较
2021-07-19 Mac命令删除文件夹和文件命令
点击右上角即可分享
微信分享提示