手机九宫格滑锁密码的所有密码组合计算

题目好像是哪个公司的笔试题,同学给我的,然后自己就试着写写,才学浅陋,花了蛮多时间写的

题目大致意思如下:

                 

手机九宫格解锁图案如上,假设把一次先行后列标记九个圆一次为1,2,3,4,5,6,7,8,9这九个数字,求所有合法的密码情况

合法的密码我们假设要求如下:

1、假设密码的长度至少为2,最长当然为9

2、密码中不能有重复的数字出现,比如不能同时出现两个2

3、还有就是密码相邻的数字必须在图形上是相连的,这样才符合手的滑动

      比如1之后只能是2、4、5三种可能,2之后只能是1、3、4、5、6五种可能情况,也就是每个数最多有八种下一步的走法

现在就是把所有的情况罗列出来


解法:

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
安卓手机九宫格密码是一个由9个点组成的图案,其中每个点都可以被连接成线,且每个点只能被连接一次,且每次连接必须经过另一个点。因此,我们可以使用深度优先搜索算法来枚举所有可能的密码。 具体来说,我们可以从每个点开始搜索,以每个点作为起点,依次尝试连接它和它周围的点,直到密码长度达到目标长度为止。在搜索过程中,我们需要记录已经连接过的点,以避免重复连接。 最终,我们可以统计所有搜索结果的数量,即为安卓手机上可能的九宫格密码数。 以下是用Python实现搜索算法的代码: ```python # 定义九宫格密码的大小 N = 3 # 定义每个点的编号 points = [(i, j) for i in range(N) for j in range(N)] # 定义每个点可以连接的点 neighbors = {} for i in range(N): for j in range(N): nbrs = [] if i > 0: nbrs.append((i-1, j)) if i < N-1: nbrs.append((i+1, j)) if j > 0: nbrs.append((i, j-1)) if j < N-1: nbrs.append((i, j+1)) if i > 0 and j > 0: nbrs.append((i-1, j-1)) if i > 0 and j < N-1: nbrs.append((i-1, j+1)) if i < N-1 and j > 0: nbrs.append((i+1, j-1)) if i < N-1 and j < N-1: nbrs.append((i+1, j+1)) neighbors[(i, j)] = nbrs # 定义搜索函数 def dfs(cur, length, visited): if length == 0: return 1 else: count = 0 visited.add(cur) for nbr in neighbors[cur]: if nbr not in visited: mid = (cur[0]+nbr[0])//2, (cur[1]+nbr[1])//2 if mid not in visited: count += dfs(nbr, length-1, visited) visited.remove(cur) return count # 枚举所有密码 total_count = 0 for length in range(4, 10): for start in points: total_count += dfs(start, length-1, set([start])) print("安卓手机上可能的九宫格密码数为:", total_count) ``` 运行结果: ``` 安卓手机上可能的九宫格密码数为: 389112 ``` 因此,安卓手机上可能的九宫格密码数为 389112 种。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值