【Algorithm】Keyboards

来源:互联网 发布:酷乐视q6装软件 编辑:程序博客网 时间:2024/06/10 10:17

题目:
用键盘打出字符串,需要走多少步。
题目中同行没有不同字母是不允许移动的。可以看下面的例子来理解。
分析:
例子一:
ABCDEFGHIJKLMNOPQZY
X*****************Y
键盘长上面这个样子,要打出AZAZ,需要多少步呢
A, select , move downX , move right- , move right -Y , move left- , move up  Z, select , move down*, move leftX, move up—
A, select  downX , move right- , move right -Y , move left- , move up  Z, select , move down*, select.
一共 19 步
这个例子中,XY中间很多,那么表示这些是一个按键,那么从X->Y只要2步
例子二:
6 4
AXYB
BBBB
KLMB
OPQB
DEFB
GHI*
第二行中全部都是B,这一行代表了 key B, 如果当前光标在 左起 第一个B字符, 这个时候是不允许右移,因为右边不存在不同于 B 的key. 此时就只能下移。

6 4
AXYB
BBBB
KLMB
OPQB
DEFB
GHI*
AB
第四列都是B, 纵向的这些B字符 代表 key B, 如果当前光标在上起第一个 B 字符, 这种场景, 允许直接从第一个B 字符,跳过所有相同字符 B, move 一步 到 key *.

解题
如果没有同行相同字母的问题,那就是多次BFS,起点分别是上一次的终点和下一次字母所在位置。但有了这个条件之后,单次BFS可以保证当前最优,却不能保证所有点的最终距离最优
此外,还有一个难点是可达位置,不再简单的是上下左右,可能会因为存在相同字母,跳到下一个位置。

原创粉丝点击