很怀旧的一道题——如果没有使用过按键手机,是很难在上机现场做出这道题的。

在九键手机中,2~9号键对应字母,其中除了7、9号键对应四个字母外,其余6个数字键对应三个字母。因此,不妨将每个字母对应需要按动的次数存入数组;判断字符串中相邻两个字母是否位于同一个数字按键也就转化为这两个字母在字母表上的编号之差是否与他们在键盘上按动次数之差相等——若相等则在同一按键,对应需要额外等待2个时间周期;反之则按键不同。

#include <bits/stdc++.h>
#define _CRT_SECURE_NO_DEPRECATE

int main() {
    std::string target;
    while (std::cin >> target) {
        /*
        ┌=====|=====|=====┐
        |  1  |  2  |  3  |
        |     | ABC | DEF |
        |-----|-----|-----|
        |  4  |  5  |  6  |
        | GHI | JKL | MNO |
        |-----|-----|-----|
        |  7  |  8  |  9  |
        |PQ RS| TUV |WX YZ|
        |-----|-----|-----|
        |  *  |  0  |  #  |
        |     |Space|     |
        └=================┘
        */
        std::vector<int> letterKeyTouchCountRefList = {1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 4, 1, 2, 3, 1, 2, 3, 4};
        int sameKeyInterval = 2, totalTime = 0;
        for (int i = 0; i < target.size(); i++) {
            if (i != 0 &&
                    target[i] - target[i - 1] == letterKeyTouchCountRefList[target[i] - 'a'] -
                    letterKeyTouchCountRefList[target[i - 1] - 'a']) {
                // 字母与上一个字母位于同一键上,需要在上一个字母输入后额外等待
                totalTime += sameKeyInterval;
            }
            // 按了就是按了;总时间加上输入这个字母必然需要按动的时间段数
            totalTime += letterKeyTouchCountRefList[target[i] - 'a'];
        }
        std::cout << totalTime << std::endl;
    }
    return 0;
}