题目描述
按照手机键盘输入字母的方式,计算所花费的时间 如:a,b,c都在“1”键上,输入a只需要按一次,输入c需要连续按三次。 如果连续两个字符不在同一个按键上,则可直接按,如:ad需要按两下,kz需要按6下 如果连续两字符在同一个按键上,则两个按键之间需要等一段时间,如ac,在按了a之后,需要等一会儿才能按c。 现在假设每按一次需要花费一个时间段,等待时间需要花费两个时间段。 现在给出一串字符,需要计算出它所需要花费的时间。
输入描述:
一个长度不大于100的字符串,其中只有手机按键上有的小写字母
输出描述:
输入可能包括多组数据,对于每组数据,输出按出Input所给字符串所需要的时间
示例1
输入
bob www
输出
7 7
来源:清华大学研究生复试试题
分析:一开始这个题有个小坑,题目所说的手机键盘就是日常所见的九宫格键盘。不过如果不注意细节的话我们很可能认为每个键只包括三个字母,但实际键盘是这样的,如图
这也是为什么题意中说kz需要按6下,因为按Z时需要按4下。
注意到这个细节之后进行模拟就行了,题目的测试数据给的比较水,运用暴力是不会超时的
#include<stdio.h>
const int M1=27,M2=1e2+5;
int table1[M1]={0,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 i,j,k,n,m,sum,s1,s2;//上面的table表用于存取每个字母需要按的次数
char a[M2];
int test(int h)//test函数用于辨别每个字母所在的键
{
int t;
if(h<27&&h>22) return 8;
else if(h>19&&h<23) t=7;
else if(h>15&&h<20) t=6;
else if(h>12&&h<16) t=5;
else if(h>9&&h<13) t=4;
else if(h>6&&h<10) t=3;
else if(h>3&&h<7) t=2;
else t=1;
return t;
}
int main()
{
while(scanf("%s",a)!=EOF)
{
n=0,sum=0;
while(a[n]) n++;
sum+=table1[a[0]-96];//首字母前没有字母,不考虑等待时间,直接算按键时间
for(i=1;i<n;i++)
{
s1=a[i]-96;
s1=test(s1);//辨别当前字母所在的键
s2=a[i-1]-96;
s2=test(s2);//辨别前一个字母所在的键
if(s1==s2)sum+=2;//如果两个所在的键相同,要加上等待时间
sum+=table1[a[i]-96];//加上当前字母按键时间
}
printf("%d\n",sum);//输出所需要的总时间
}
}