一个典型的电话拨号盘 拨号算距离问题

题目如下:

一个典型的电话拨号盘如下:

1 2 3
4 5 6
7 8 9
* 0 #

手指在两个按键之间的移动距离被定义成这两个键的x、y坐标差的绝对值之和。比如,6到自身的距离是0,到3、5、9的距离是1,到2、4、8、#的距离是2,到1、7、0的距离是3,到*的距离是4。
现在要你算一下,拨一个号手指所需要移动的最小距离是多少?假设手指初始位置在“5”。

输入
一行,一个字符串,表示需要拨的电话号码。

输入约束
电话号码的每一位仅包含数字“0”到“9”,且总长度范围是 [3,20]

输出
一个整数,表示拨完这个号码手指最少需要移动的距离

例子
输入
911
输出
6

 

这个题就是一个道曼哈顿距离问题。

但是我用python简单实现为

 

import sys
line = sys.stdin.readline().strip()

call={'1': (1, 1),
      '2': (1, 2),
      '3': (1, 3),
      '4': (2, 1),
      '5': (2, 2),
      '6': (2, 3),
      '7': (3, 1),
      '8': (3, 2),
      '9': (3, 3),
      '*': (4, 1),
      '0': (4, 2),
      '#': (4, 3),
      }

org = '5'

o_l = call.get(org)[0]
o_r = call.get(org)[1]

ll = 0

for d in line:
    t_l = call.get(d)[0]
    t_r = call.get(d)[1]

    ll += (abs(o_l-t_l) + abs(o_r - t_r))

    o_l = call.get(d)[0]
    o_r = call.get(d)[1]

print ll

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值