lotus

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

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

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 2023-07-19 18:18  白露~  阅读(36)  评论(0编辑  收藏  举报