351 安卓系统手势解锁-动态规划

这篇博客讨论了安卓手势解锁的问题,其中涉及到一个3x3的网格。内容阐述了有效的解锁手势条件,并通过动态规划的方法,计算至少经过m个点且最多经过n个点的不同解锁手势数量。给出了具体的例子和解决思路,包括使用DFS搜索满足要求的路径,并考虑对称性简化计算过程。
摘要由CSDN通过智能技术生成

题目描述:
我们都知道安卓有个手势解锁的界面,是一个 3 x 3 的点所绘制出来的网格。
给你两个整数,分别为 ​​m 和 n,其中 1 ≤ m ≤ n ≤ 9,那么请你统计一下有多少种解锁手势,是至少需要经过 m 个点,但是最多经过不超过 n 个点的。

先来了解下什么是一个有效的安卓解锁手势:

每一个解锁手势必须至少经过 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 ,但是点 2 在该手势中之前已经被连过了。

有效手势:6 - 5 - 4 - 1 - 9 - 2
连接点 1 和点 9 是有效的,因为虽然它经过了按键 5 ,但是点 5 在该手势中之前已经被连过了。

示例:
输入: m = 1,n = 1
输出: 9
方法1:
主要思路:
(1)对于3*3的网格界面,当前位置可以跳到的位置是相邻的位置,或相隔一个键的位置;
(2)跳到相邻的位置时,要求相邻位置没有被访问过即可;
(3)跳到相隔一个键的位置,要求相隔的这个键被访问过,但要跳到的这个位置没有被访问过;
(4)根据这个思路,定义两个数组,一个一维的数组visited用来标识访问过的位置,一个二维数组,使用当前位置和要跳到间隔位置,来查找相隔的中间键的值,使用该键值来确定该中间位置是否访问过;
(5)然后从以1为起点,dfs搜索所有的满足要求的路径,记录数量,由于结构的对称性,以3,7,9为起点获得的路径的数量相同,故直接乘以4即可,同理对于以2为起点,获得路径数量,乘以4,表示其他的4,6,8三个位置为起点获得的路径数量,再以5为起点,获得路径数量,将上述三组数量相加,即为总的数量;

class Solution {
   
public:
    
    int dfs(int m,int n,int begin,int len,int res,bool* visited,int jumps[][10]){
   
    	//路径长度至少为m,才满足要求,可以统计
        if(len>=m)
            ++res;<
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值