首页 > 试题广场 >

手机键盘

[编程题]手机键盘
  • 热度指数:32168 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 64M,其他语言128M
  • 算法知识视频讲解
按照手机键盘输入字母的方式,计算所花费的时间 如:a,b,c都在“1”键上,输入a只需要按一次,输入c需要连续按三次。 如果连续两个字符不在同一个按键上,则可直接按,如:ad需要按两下,kz需要按6下 如果连续两字符在同一个按键上,则两个按键之间需要等一段时间,如ac,在按了a之后,需要等一会儿才能按c。 现在假设每按一次需要花费一个时间段,等待时间需要花费两个时间段。 现在给出一串字符,需要计算出它所需要花费的时间。

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


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

输入

bob
www

输出

7
7
#include<stdio.h>
#include<map>
using namespace std;
int main(){
    map<char,int> chartoint;
    chartoint['a']=2;
    chartoint['b']=2;
    chartoint['c']=2;
    chartoint['d']=3;
    chartoint['e']=3;
    chartoint['f']=3;
    chartoint['g']=4;
    chartoint['h']=4;
    chartoint['i']=4;
    chartoint['j']=5;
    chartoint['k']=5;
    chartoint['l']=5;
    chartoint['m']=6;
    chartoint['n']=6;
    chartoint['o']=6;
    chartoint['p']=7;
    chartoint['q']=7;
    chartoint['r']=7;
    chartoint['s']=7;
    chartoint['t']=8;
    chartoint['u']=8;
    chartoint['v']=8;
    chartoint['w']=9;
    chartoint['x']=9;
    chartoint['y']=9;
    chartoint['z']=9;
    map<char,int> chartime;
    chartime['a']=1;
    chartime['b']=2;
    chartime['c']=3;
    chartime['d']=1;
    chartime['e']=2;
    chartime['f']=3;
    chartime['g']=1;
    chartime['h']=2;
    chartime['i']=3;
    chartime['j']=1;
    chartime['k']=2;
    chartime['l']=3;
    chartime['m']=1;
    chartime['n']=2;
    chartime['o']=3;
    chartime['p']=1;
    chartime['q']=2;
    chartime['r']=3;
    chartime['s']=4;
    chartime['t']=1;
    chartime['u']=2;
    chartime['v']=3;
    chartime['w']=1;
    chartime['x']=2;
    chartime['y']=3;
    chartime['z']=4;
    char str[101];
    int lastkey=1;
    while(scanf("%s",str)!=EOF){
        int totaltime=0;
        for(int i=0;str[i]!='\0';i++){
            //str[i]表示本次输入的字母
            if(lastkey==chartoint[str[i]]){
                totaltime=totaltime+2;
            }
            totaltime=totaltime+chartime[str[i]];
            lastkey=chartoint[str[i]];
        }
        printf("%d\n",totaltime);
    }
}
发表于 2023-02-26 17:18:26 回复(0)
#include <cstdio> #include <string>  using namespace std;   int main() { int keyboard[26]={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};  char str[1000];  string input;  while(scanf("%s",str)!=EOF){
        input=str;  int time=0;  for(int i=0;i<input.length();i++){
            time+=keyboard[input[i]-'a'];  if(i!=0 && input[i]-input[i-1]==keyboard[input[i]-'a']-keyboard[input[i-1]-'a']){
                time+=2;  }
        }
        printf("%d\n",time);   } return 0; }
发表于 2023-02-20 16:56:25 回复(0)
//如果用数组来统计按键次数,若相邻两个字母在同一个键上的判断为:
//数组下标差=数组存储按键次数差
#include<cstdio>
#include<iostream>
#include<string>
using namespace std;

//预处理按键位置
int mod[26] = {0,0,0,1,1,1,2,2,2,3,3,3,4,4,4,5,5,5,5,6,6,6,7,7,7,7};
//查找按键位置
int FindAnjian(char a){
    return mod[a-'a'];
}
int main(){
    string str;
    while(cin >> str){
        int time=0;
        int len=str.size();
        for(int i=0;i<len;++i){
            if(i>0 && FindAnjian(str[i])==FindAnjian(str[i-1])){
                time+=2;
            }
            int temp=1;//统计按键次数
            int cur = str[i]-'a';
            while(cur>0 && mod[cur]==mod[cur-1]){
                cur--;
            }
            while(cur!=str[i]-'a'){
                temp++;
                cur++;
            }//统计按键次数结束
            time+= temp;
        }
        cout<<time<<endl;
    }
    return 0;
}
发表于 2021-03-24 15:56:36 回复(0)
//1符号 2ABC 3DEF 4GHI 5JKL 6MNO 7PQRS 8TUV 9WXYZ

#include<iostream>
#include<map>
using namespace std;
char str[101];
map<char,int>mp,time_mp;
int main(){
    time_mp['a']=time_mp['d']=time_mp['g']=time_mp['j']=time_mp['m']=
        time_mp['p']=time_mp['t']=time_mp['w']=1;
    time_mp['b']=time_mp['e']=time_mp['h']=time_mp['k']=time_mp['n']=
        time_mp['q']=time_mp['u']=time_mp['x']=2;
    time_mp['c']=time_mp['f']=time_mp['i']=time_mp['l']=time_mp['o']=
        time_mp['r']=time_mp['v']=time_mp['y']=3;
    time_mp['z']=time_mp['s']=4;
    
    mp['a']=mp['b']=mp['c']=2;
    mp['d']=mp['e']=mp['f']=3;
    mp['g']=mp['h']=mp['i']=4;
    mp['j']=mp['k']=mp['l']=5;
    mp['m']=mp['n']=mp['o']=6;
    mp['p']=mp['q']=mp['r']=mp['s']=7;
    mp['t']=mp['u']=mp['v']=8;
    mp['w']=mp['x']=mp['y']=mp['z']=9;
    while(scanf("%s",str)!=EOF){
        int res=0,str_len=0;
        for(;str[str_len];str_len++);
        for(int i=0;i<str_len;i++){
            if(i>0){
                if(mp[str[i]]==mp[str[i-1]])res+=2;
            }
            res+=time_mp[str[i]];
        }
        cout<<res<<endl;
    }
    return 0;
}

发表于 2021-02-17 17:13:52 回复(0)
switch写的挺麻烦,但是也蛮好懂的
#include<iostream>
#include<cstring>
using namespace std;
int main(){
    char str1[100];
    while(scanf("%s",str1)!=EOF){
        int wait=2,i,j,t=1,time_sum=0;
        int len=strlen(str1),flag[len];
        for(i=0;i<len;i++){//用switch判断按一个字母要多长时间,用flag判断字母是否连续
            switch(str1[i]){
                case 'a':flag[i]=2;time_sum+=t;break;
                case 'd':flag[i]=3;time_sum+=t;break;
                case 'g':flag[i]=4;time_sum+=t;break;
                case 'j':flag[i]=5;time_sum+=t;break;
                case 'm':flag[i]=6;time_sum+=t;break;
                case 'p':flag[i]=7;time_sum+=t;break;
                case 't':flag[i]=8;time_sum+=t;break;
                case 'w':flag[i]=9;time_sum+=t;break;
                case 'b':flag[i]=2;time_sum+=2*t;break;
                case 'e':flag[i]=3;time_sum+=2*t;break;
                case 'h':flag[i]=4;time_sum+=2*t;break;
                case 'k':flag[i]=5;time_sum+=2*t;break;
                case 'n':flag[i]=6;time_sum+=2*t;break;
                case 'q':flag[i]=7;time_sum+=2*t;break;
                case 'u':flag[i]=8;time_sum+=2*t;break;
                case 'x':flag[i]=9;time_sum+=2*t;break;
                case 'c':flag[i]=2;time_sum+=3*t;break;
                case 'f':flag[i]=3;time_sum+=3*t;break;
                case 'i':flag[i]=4;time_sum+=3*t;break;
                case 'l':flag[i]=5;time_sum+=3*t;break;
                case 'o':flag[i]=6;time_sum+=3*t;break;
                case 'r':flag[i]=7;time_sum+=3*t;break;
                case 'v':flag[i]=8;time_sum+=3*t;break;
                case 'y':flag[i]=9;time_sum+=3*t;break;
                case 's':flag[i]=7;time_sum+=4*t;break;
                case 'z':flag[i]=9;time_sum+=4*t;break;
            }
            if(i>=1&&flag[i]==flag[i-1]) time_sum+=wait;
        }
        printf("%d\n",time_sum);
    }
    return 0;
}


发表于 2021-02-04 15:49:07 回复(0)
#include<iostream>
#include<string>

using namespace std;

int nums[26] = {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};

//该函数用于输出字符串所用的总时间
void total_time(string s)
{
    int waiting_time=0;//初始化总的等待时间
    int total=0;//初始化总时间
    int temp_1;
    int temp_2;
    //遍历相邻字符,n个字符需要比较n-1次
    for(int i=0;i<s.size()-1;i++)
    {
        temp_1 = s[i+1]-s[i];
        temp_2 = nums[int(s[i+1])-97]-nums[int(s[i])-97];
        //如果两个字符对应的按键次数之差等于他们的距离之差,说明在同一个键上
        if(temp_2==temp_1)
        {
            waiting_time+=2;
        }
       total += nums[int(s[i])-97];
    }
    total += nums[int(s[s.size() - 1]) - 97] + waiting_time;
    cout<<total<<endl;
}

int main()
{
    vector<string> v;
    string s;
    while(cin>>s)
        total_time(s);
    system("pause");
    return 0;
}

编辑于 2021-01-25 16:26:10 回复(0)
#include <iostream>
#include <cstdio>
using namespace std;

//按键花费1个时间,等待花费两个时间
//多组测试数据,每个输入为长度不大于100的字符串,
//只有手机上按键上有的小写字母
const int MAXN = 101;//!!!数据量定义为常数,至少要多一个位置存储‘\0’
char s[MAXN];
char keypad[8][5]={
    "abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"
};
int timespend(char a){//计算一个字符单独输入需要的时间
    bool flag = false;//控制循环的标志
    int time;
    for(int i=0;i<8;i++){
        for(int j=0;keypad[i][j]!='\0';j++){
            if(keypad[i][j]==a){//!!!!字符类型数据可以直接比较大小
                flag = true; //成功找到目标字符
                time = j+1;
                break;
            }
        }
        if(flag == true){//某一轮找到就结束外层循环
            break;
        }
    }
    return time;
}
bool issamebutton(char a, char b){//用于判断两个字符是否是属于同一按键
    int pa,pb;
    for(pa=0; pa<8;pa++){
        bool flag = false;
        for(int j=0; keypad[pa][j]!='\0'; j++){
            if(keypad[pa][j]==a){
                flag = true;
                break;
            }
        }
        if(flag==true){
            break;
        }
    }
    for(pb=0; pb<8;pb++){
        bool flag = false;
        for(int j=0; keypad[pb][j]!='\0'; j++){
            if(keypad[pb][j]==b){
                flag = true;
                break;
            }
        }
        if(flag==true){
            break;
        }
    }
    if(pa==pb){
        return true;
    }
    else{
        return false;
    }
}
int main()
{
    int i, time=0, span=2;//两个工作游标,span为同一按键间隔时间
    while(scanf("%s",s) != EOF){
        //单独计算第一个位置的输入时间
        if(s[0]!='\0'){
            time += timespend(s[0]);
        }
        for(i=1; s[i]!='\0'; i++){
            if(issamebutton(s[i-1],s[i])){//若是同一按键
                time += timespend(s[i]) + span;
            }
            else{//不是同一按键
                time += timespend(s[i]);
            }
        }
        printf("%d\n", time);
    }
    return 0;
}

发表于 2021-01-12 21:27:39 回复(0)
#include<stdio.h>
#include<string.h>
int main()
{
    /*预存储数据,将键盘字母、最小时间保存在数组中*/
    int Keybord[26]={
    1,1,1,//abc
    2,2,2,//def
    3,3,3,//ghi
    4,4,4,//jkl
    5,5,5,//mno
    6,6,6,6,//pqrs
    7,7,7,//tuv
    8,8,8,8};//wxyz,存储26个字母在键盘上的位置

    int minitime[26]={
    1,2,3,//abc
    1,2,3,//def
    1,2,3,//ghi
    1,2,3,//jkl
    1,2,3,//mno
    1,2,3,4,//pqrs
    1,2,3,//tuv
    1,2,3,4}; //wxyz 存储26个字母输入的最小时间 

    char input[120];
    scanf("%s",input);
    int l=strlen(input),i,time=0;
    for(i=0;i<l;i++)
    {
        int temp=input[i]-97;
        if(i>=1)
        {
            if(Keybord[temp]==Keybord[input[i-1]-97])//如果后相邻两个字母在键盘上的位置相同 
            time=time+2;
        }
        time=time+minitime[temp];
     } 
    printf("%d",time);
    return 0;
}
编辑于 2020-04-29 16:21:14 回复(0)
/* 1 : abc
    2: def
     3:ghi
     4:jkl
     5:mno
     6:pqrs
     7:tuv
     8:wxyz
*/
#include <stdio.h>
(737)#include <iostream>
using namespace std;
int loc(char c){
    switch(c){
    case 'a':return 11;case 'b':return 12;case 'c': return 13;
    case 'd':return 21;case 'e':return 22;case 'f': return 23;
    case 'g':return 31;case 'h':return 32;case 'i':return 33;
    case 'j':return 41;case 'k':return 42;case 'l': return 43;
    case 'm':return 51;case 'n':return 52;case 'o': return 53;
    case 'p':return 61;case 'q':return 62;case 'r': return 63;case 's':return 64;
    case 't':return 71;case 'u':return 72;case 'v': return 73;
    case 'w':return 81;case 'x':return 82;case 'y':return 83; case 'z':return 84;  
    }
}

int main(){
    char str[101];
    while(scanf("%s",str) != EOF){
        int time = loc(str[0])%10;//取按的次数
        for(int i=0;str[i+1]!= NULL;i++){
            if(loc(str[i+1])/10 == loc(str[i])/10){
                time+= 2;
                time+= (loc(str[i+1])%10);
            }
            else time+= (loc(str[i+1])%10);
        }
        cout << time << endl;
    }
}

发表于 2020-04-15 13:13:30 回复(0)
不好意思,我用26键,输入的字符串str可以直接输出strlen(str),期间等待时间为0。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
    int keyboard[26] = {             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};

    char str[101];
    while(~scanf("%s", str))
    {
        int time = keyboard[str[0] - 'a'];
        int len = strlen(str);
        for(int i = 1; i < len; i++)
        {
            time += keyboard[str[i] - 'a'];
            if(keyboard[str[i] - 'a'] - keyboard[str[i - 1] - 'a'] == str[i] - str[i - 1])
                time += 2;
        }

        printf("%d\n", time);

    }
    return 0;
}
看了最高赞答案才写成这样,我写不了这么简洁,我莫得那个脑子。
编辑于 2020-03-30 15:34:57 回复(0)
我的C++解决方案
#include <iostream>
#
include <string>
#include <vector>
#
include <cmath>
#include <algorithm>

using namespace std;

class Solution {
    private:
        string keyboard[8] = {
            "abc",
            "def",
            "ghi",
            "jkl",
            "mno",
            "pqrs",
            "tuv",
            "wxyz"
        } ;
        bool isOnTheSameKey(char a,char b) {
            for(int i=0; i<8; i++) {
                if(this->keyboard[i].find(a)!=string::npos && this->keyboard[i].find(b)!=string::npos) {
                    return true;
                }
            }
            return false;
        };
        int getPos(char c) {
            for(int i=0; i<8; i++) {
                int pos = this->keyboard[i].find(c);
                if(pos!= -1) {
                    return pos;
                }
            }
        }
    public:
        void solute(string word) {
            int count = 0;
            for(int j=0; j<word.length(); j++) {
                int pos = getPos(word[j]);
                count += (pos + 1);
                if(j>0 && isOnTheSameKey(word[j-1],word[j])) {
                    count+=2;
                }
            }
            cout << count<<endl;
        }
};

int main(int argc, char** argv) {
    vector<string> words;
    Solution solution;
    string word;
    while(cin>>word) {
        solution.solute(word);
    }
    return 0;
}


发表于 2020-03-19 11:46:06 回复(0)
#include<iostream>
#include<cstdio>
using namespace std;

int keboardTab[26] = {
    1,2,3, // abc
    1,2,3, // def
    1,2,3, // ghi
    1,2,3, // jkl
    1,2,3, // mno
    1,2,3,4, // pqrs
    1,2,3, // tuv
    1,2,3,4, // wxyz
};

int main()
{
    string s;
    while(cin>> s)
    {
        int time = 0;
        for(int i=0; i < s.size(); i++)
        {
            time += keboardTab[s[i] - 'a'];
            if(i != 0 && s[i] - s[i-1] == keboardTab[s[i] - 'a'] - keboardTab[s[i-1] - 'a'])
            {
                time +=2;
            }
        }
        cout<<time<<endl;
    }
    return 0;
}

这题没什么难度,就是time+=2的判定条件那里需要考虑几分钟。


编辑于 2020-03-02 14:46:35 回复(0)
#include <iostream>
#include <string>

using namespace std;

int main(){
    int times[26] = {
        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 button[26] = {
        2,2,2,
        3,3,3,
        4,4,4,
        5,5,5,
        6,6,6,
        7,7,7,7,
        8,8,8,
        9,9,9,9
    };
    
    string str;
    while(cin>>str){
        int num = times[str[0]-'a'];
        for(int i=1; i<str.length();i++){
            num += times[str[i]-'a'];
            if(button[str[i]-'a']==button[str[i-1]-'a'])
                num += 2;
        }
        cout << num << endl;
    }
}

发表于 2020-02-18 21:50:34 回复(0)
#include <iostream>
using namespace std;
char phone[][5] = { "","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz" };
//算法思想:使用一个字符串记录,用while循环,然后记录字符的时间以及间隔求时间和
int main()
{
    int num = 0;
    char a[101];
    int tag = 0;
    while (cin >> a)
    {
        for (int k = 0; k <= 100; k++)
        {
            if (a[k] == '\0')
            {
                break;
            }
            for (int i = 1; i <= 8; i++)
            {
                for (int j = 0; j < 4; j++)
                    if (a[k] == phone[i][j])
                    {
                        if (tag == i)num += 2;
                        tag = i;
                        num += (j + 1);
                    }
            }
        }
        cout << num << endl;
    }
    return 0;
}
发表于 2020-02-17 17:15:53 回复(0)
#include <iostream>
#include <cstdio>
#include <string>
#include <iomanip>

using namespace std;

bool phonekeyboard(string str){
    int i;
    int time=0;
    int A[26]={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};
    for(i=0;i<str.length();i++){
        time=time+A[str[i]-'a'];
        if(i!=0 && A[str[i]-'a']-A[str[i-1]-'a']==str[i]-str[i-1])
            time=time+2;
    }
    cout<<time<<endl;
}

int main(){
    string str;
    cin>>str;
    if(str.length()>100) return 0;
    phonekeyboard(str);
    return 0;
}

发表于 2020-02-17 14:17:35 回复(0)
我想关键就在于如何去判断相邻两个字符是否属于同一按键内,根据高赞作者 som8body 与王道书的内容,字母在字符串中本身的间距等于按键次数之差,则属于同一按键,真是精妙的想法鸭!
#include<iostream>
#include<cstdio>
using namespace std;
//数据预处理
const int keytab[26] = {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 main(){
    string str;
    while(cin>>str){
    	int time = 0;
        for(int i=0; i<str.length(); i++){
            time += keytab[str[i]-'a'];
            if(i!=0&&(str[i]-str[i-1]==keytab[str[i]-'a']-keytab[str[i-1]-'a'])){
                time += 2;
            }
        }
        cout<<time<<endl;
    }
    return 0;
}

发表于 2020-02-12 11:50:50 回复(0)
一开始以为每个键都是3个字母,结果翻车了,掏出手机打开9键输入法后改正了错误
#include "stdio.h"
#include "stdlib.h"
#include "string.h"

/*
 1   2   3
abc def ghi
 4   5   6
jkl mno pqrs
 7   8 
tuv wxyz
*/

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

int which_key(char ch) //该按哪个键
{
    int i, j;
    for (i = 0; i < 8; i++)
    {
        for (j = 0; j < 4; j++)
        {
            if (keyboard[i][j] == ch)
            {
                return (i + 1);
            }
        }
    }
}

int num_key(char ch) //该按几次
{
    int i, j;
    for (i = 0; i < 8; i++)
    {
        for (j = 0; j < 4; j++)
        {
            if (keyboard[i][j] == ch)
            {
                return (j + 1);
            }
        }
    }
}

int main()
{
    int len, last_key, i, t;
    char str[200] = {0};

    while (scanf("%s", str) != EOF)
    {
        last_key = 0;
        t = 0;
        len = strlen(str);
        for (i = 0; i < len; i++)
        {
            if (last_key == which_key(str[i]))
                t += 2;                   //和上一次按的键相同,续2秒
            t += num_key(str[i]);         //按键了,每按一次续1s
            last_key = which_key(str[i]); //记录这次按的键
        }
        printf("%d\n", t);
    }

    return 0;
}


发表于 2020-02-10 23:08:25 回复(0)
纯c语言,没有用辅助数组,直接硬钢
#include <stdio.h>
#include <stdlib.h>

int main()
{
    char a[100];
    int i = 0;
    while(scanf("%s",a)!=EOF){
            int count = 0;
      while(a[i]!=NULL){
            if(a[i] >= 'a' && a[i] <= 'o'){
            int ajc = (a[i]-'a'+1)%3;
            if(ajc == 0){
                  ajc = 3;
            }
            count += ajc;
            if(i>0&&(a[i]-'a')/3 == (a[i-1]-'a')/3 && a[i-1]>='a' && a[i-1]<='o'){
                  count += 2;
            }

                  }else if(a[i] >= 'P' && a[i] <= 's'){
                        int ajc = a[i]-'p'+1;
                        count += ajc;
                        if(i>0 && a[i-1]>='p' && a[i-1]<='s'){
                  count += 2;
            }
                  }else if(a[i] >= 't' && a[i] <= 'v'){
                        int ajc = a[i]-'t'+1;
                        count += ajc;
                        if(i>0 && a[i-1]>='t' && a[i-1]<='v'){
                  count += 2;
            }
                  }else{
                        int ajc = a[i]-'w'+1;
                        count += ajc;
                        if(i>0 && a[i-1]>='w' && a[i-1]<='z'){
                  count += 2;
            }
                  }
                  i++;
      }
      printf("%d\n",count);
      i = 0;
    }
    return 0;
}

发表于 2020-02-08 11:01:29 回复(0)
#include <iostream>
#include <cstring>
using namespace std;

int lastGroup;
int currentGroup;
int press;

void judgeGroup(char ch){
    switch(ch){
        case 'a':currentGroup=1;press=1;break;
        case 'b':currentGroup=1;press=2;break;
        case 'c':currentGroup=1;press=3;break;
        case 'd':currentGroup=2;press=1;break;
        case 'e':currentGroup=2;press=2;break;
        case 'f':currentGroup=2;press=3;break;
        case 'g':currentGroup=3;press=1;break;
        case 'h':currentGroup=3;press=2;break;
        case 'i':currentGroup=3;press=3;break;
        case 'j':currentGroup=4;press=1;break;
        case 'k':currentGroup=4;press=2;break;
        case 'l':currentGroup=4;press=3;break;
        case 'm':currentGroup=5;press=1;break;
        case 'n':currentGroup=5;press=2;break;
        case 'o':currentGroup=5;press=3;break;
        case 'p':currentGroup=6;press=1;break;
        case 'q':currentGroup=6;press=2;break;
        case 'r':currentGroup=6;press=3;break;
        case 's':currentGroup=6;press=4;break;
        case 't':currentGroup=7;press=1;break;
        case 'u':currentGroup=7;press=2;break;
        case 'v':currentGroup=7;press=3;break;
        case 'w':currentGroup=8;press=1;break;
        case 'x':currentGroup=8;press=2;break;
        case 'y':currentGroup=8;press=3;break;
        case 'z':currentGroup=8;press=4;break;
    }
}

int main(){
    string str;
    int time;
    while(cin>>str){
        time =0;lastGroup=-1;currentGroup=-2;press=0;//初始化
        char ch;
        for(int i=0; i<str.length(); i++){
            ch=str[i];
            judgeGroup(ch);
            if(currentGroup==lastGroup)
                time+=2;
            time+=press;
            lastGroup=currentGroup;
        }
        cout<<time<<endl;
    }
}
写完好多switch之后感觉自己是个傻子...
发表于 2020-01-23 20:36:47 回复(0)
#include<iostream>
#include<cstdio>

using namespace std;

int keytab[26]={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 main(){
    string str;
    while(cin>>str){
        int time=0;
        for(int i=0;i<str.size();i++){
            time+=keytab[str[i]-'a'];
            if(i!=0 && str[i]-str[i-1]==keytab[str[i]-'a']-keytab[str[i-1]-'a']){
                time+=2;
            }
        }
        cout<<time<<endl;
    }
    return 0;
}

发表于 2020-01-16 22:28:48 回复(0)