CF253C Text Editor
题目描述
瓦夏不情愿地敲打着键盘,绞尽脑汁写着关于荷马史诗奥德修斯的作文……他要怎么向语文老师说明自己并不打算成为作家呢?实际上,他想成为一名程序员。所以,他很乐意写程序,却丝毫不想写作文。
当瓦夏在自己想象的“黑暗池塘”中努力捕捉一句话时,他突然想到:要将光标从一个位置移动到另一个位置,最少需要按多少次键呢?
我们可以更正式地描述这个问题:为了输入文本,瓦夏正在使用文本编辑器。他已经写了 $n$ 行,第 $i$ 行包含 $a_i$ 个字符(包括空格)。如果某一行有 $k$ 个字符,那么这一行一共有 $k+1$ 个光标可停留的位置:可以在任意一个字符前,或者在该行末尾。因此,光标的位置由一对整数 $(r,c)$ 决定,其中 $r$ 表示所在的行号,$c$ 表示在该行的位置(位置从 1 开始编号,从行首到行尾)。
瓦夏不使用鼠标移动光标。他仅使用“上”、“下”、“右”和“左”这四个方向键。每按一次按键,光标会按对应的方向移动。假设按下按键前,光标位于 $(r,c)$ 位置,若按下:
- “上”:如果光标在第一行($r=1$),光标不会移动。否则,光标会移动到上一行 ($r-1$),同样的位置。如果上一行比当前位置短,即上一行没有第 $c$ 个位置,光标会移动到上一行的最后一个位置;
- “下”:如果光标在最后一行($r=n$),光标不会移动。否则,光标会移动到下一行 ($r+1$),同样的位置。如果下一行比当前位置短,即下一行没有第 $c$ 个位置,光标会移动到下一行的最后一个位置;
- “右”:如果光标可以在本行向右移动($c < a_r + 1$),就向右移动一位(到 $c+1$)。否则,如果已经在行末,再按“右”时光标不会移动;
- “左”:如果光标可以在本行向左移动($c > 1$),就向左移动一位(到 $c-1$)。否则,如果已经在行首,再按“左”时光标不会移动。
现在你得到了文本文件的行数以及每一行的字符数。请计算,从位置 $(r_1, c_1)$ 移动到 $(r_2, c_2)$,瓦夏最少需要按下多少次上述按键。
输入格式
输入第一行包含一个整数 $n$($1 \leq n \leq 100$),表示文件的行数。
第二行包含 $n$ 个整数 $a_1, a_2, \ldots, a_n$($0 \leq a_i \leq 10^5$),以空格分隔,表示每一行的字符数。
第三行包含四个整数 $r_1, c_1, r_2, c_2$($1 \leq r_1, r_2 \leq n, 1 \leq c_1 \leq a_{r_1} + 1, 1 \leq c_2 \leq a_{r_2} + 1$),表示光标的起始和目标位置。
输出格式
输出一个整数,表示将光标从位置 $(r_1, c_1)$ 移动到 $(r_2, c_2)$ 所需最少的按键次数。
说明/提示
在第一个样例中,编辑器包含四行。我们使用数字代表一行中可能的光标位置。字母 $s$ 表示光标的初始位置,$t$ 表示目标位置。那么文本编辑器中所有可能的光标位置可由下表描述:
123
12
123s567
1t345
该样例其中一种可行的方案是:“左”、“下”、“左”。
由 ChatGPT 5 翻译