锁屏解锁序列路径距离计算的Python算法实现需求
手机锁屏解锁序列路径距离计算函数实现
任务说明
我有一项训练任务,需编写Python函数计算手机锁屏解锁序列的路径距离。输入为1到9的随机序列,序列中每个数字只能紧跟其在手机锁屏上的相邻数字。
示例
锁屏数字布局如下:
matrix = [[6, 1, 9], [5, 2, 8], [4, 3, 7]]
输入序列:
hits = [9, 8, 1, 2, 3, 4]
该序列的路径总长度为 1 + 1.44 + 1 + 1 + 1。
现有代码问题
你提供的代码片段仅处理了序列前两个元素的情况,且存在索引越界风险、位置查找逻辑繁琐等问题,无法支持任意合法序列的计算。
完整实现方案
以下是完善后的代码,通过建立数字到坐标的映射简化位置查找,遍历整个序列计算总路径距离:
def calculate_lock_path_distance(hits): # 建立数字到对应坐标的映射,匹配给定的锁屏布局 num_to_pos = { 6: (0, 0), 1: (0, 1), 9: (0, 2), 5: (1, 0), 2: (1, 1), 8: (1, 2), 4: (2, 0), 3: (2, 1), 7: (2, 2) } total_distance = 0.0 # 遍历序列中连续的数字对 for i in range(1, len(hits)): # 获取当前数字和前一个数字的坐标 prev_pos = num_to_pos[hits[i-1]] curr_pos = num_to_pos[hits[i]] dx = abs(curr_pos[0] - prev_pos[0]) dy = abs(curr_pos[1] - prev_pos[1]) # 判断距离类型:上下左右相邻(距离1)或对角线相邻(距离1.44) if dx + dy == 1: total_distance += 1.0 elif dx == 1 and dy == 1: total_distance += 1.44 return total_distance # 测试示例 hits = [9, 8, 1, 2, 3, 4] print(calculate_lock_path_distance(hits)) # 输出:5.44
代码说明
- 数字坐标映射:用字典直接存储每个数字对应的矩阵坐标,避免每次遍历矩阵查找位置,提升效率。
- 遍历序列计算:循环遍历序列中每一对连续数字,计算它们的坐标差。
- 距离判断:
- 若横纵坐标差之和为1,说明是上下或左右相邻,距离加1;
- 若横纵坐标差均为1,说明是对角线相邻,距离加1.44(与示例中的近似值保持一致)。
内容的提问来源于stack exchange,提问作者Netbek
相关产品推荐
相关产品推荐

