手机键盘

题目链接
题目描述
按照手机键盘输入字母的方式,计算所花费的时间 如:a,b,c都在“1”键上,输入a只需要按一次,输入c需要连续按三次。 如果连续两个字符不在同一个按键上,则可直接按,如:ad需要按两下,kz需要按6下 如果连续两字符在同一个按键上,则两个按键之间需要等一段时间,如ac,在按了a之后,需要等一会儿才能按c。 现在假设每按一次需要花费一个时间段,等待时间需要花费两个时间段。 现在给出一串字符,需要计算出它所需要花费的时间。

输入描述
一个长度不大于100的字符串,其中只有手机按键上有的小写字母

输出描述
输入可能包括多组数据,对于每组数据,输出按出Input所给字符串所需要的时间

示例1

输入
bob
www
输出
7
7

代码实现

#include 
#include 

char buf[26][2] = {
    {'a', 1},
    {'b', 2},
    {'c', 3},
    {'d', 1},
    {'e', 2},
    {'f', 3},
    {'g', 1},
    {'h', 2},
    {'i', 3},
    {'j', 1},
    {'k', 2},
    {'l', 3},
    {'m', 1},
    {'n', 2},
    {'o', 3},
    {'p', 1},
    {'q', 2},
    {'r', 3},
    {'s', 4},
    {'t', 1},
    {'u', 2},
    {'v', 3},
    {'w', 1},
    {'x', 2},
    {'y', 3},
    {'z', 4},
};

int main(void) {
    char str[100] = { 0 };
    int cnt = 0;
    int tmp_1 = 0;
    int tmp_2 = 0;
    int j = 0;
    while (scanf("%s", str) != EOF) {
        cnt = 0;
        int n = strlen(str);
        for (int i = 0; i < n; i++) {
            if (str[i + 1]) {
                j = 0;
                while (str[i] - buf[j][0]) {
                    j++;
                }
                cnt += buf[j][1];
                tmp_1 = buf[j][1];
                if ((buf[j][0] >= 'p' && buf[j][0] <= 's') || (buf[j][0] >= 'w' && buf[j][0] <= 'z')) {
                    tmp_2 = 4 - tmp_1;
                    if (str[i + 1] >= buf[j - tmp_1 + 1][0] && str[i + 1] <= buf[j + tmp_2][0]) {
                        cnt += 2;
                    }
                } else {
                    tmp_2 = 3 - tmp_1;
                    if (str[i + 1] >= buf[j - tmp_1 + 1][0] && str[i + 1] <= buf[j + tmp_2][0]) {
                        cnt += 2;
                    }
                }
            } else {
                j = 0;
                while (str[i] - buf[j][0]) {
                    j++;
                }
                cnt += buf[j][1];
            }
        }
        printf("%d\n", cnt);
    }
    return 0;
}

你可能感兴趣的:(手机键盘)