P1765 手机
1.题目介绍
手机
题目描述
一般的手机的键盘是这样的:

要按出英文字母就必须要按数字键多下。例如要按出 \(\tt x\) 就得按 \(9\) 两下,第一下会出 \(\tt w\),而第二下会把 \(\tt w\) 变成 \(\tt x\)。\(0\) 键按一下会出一个空格。
你的任务是读取若干句只包含英文小写字母和空格的句子,求出要在手机上打出这个句子至少需要按多少下键盘。
输入格式
一行句子,只包含英文小写字母和空格,且不超过 200 个字符。
输出格式
一行一个整数,表示按键盘的总次数。
样例 #1
样例输入 #1
i have a dream
样例输出 #1
23
提示
NOI 导刊 2010 普及(10)
2.题解
2.1 switch case
代码
#include <bits/stdc++.h>
using namespace std;
int main()
{
string str;
getline(cin, str);
int count = 0;
for(char ch:str){
switch(ch){
case 'a':
case 'd':
case 'g':
case 'j':
case 'm':
case 'p':
case 't':
case 'w':
case ' ':{
count++;
break;
}
case 'b':
case 'e':
case 'h':
case 'k':
case 'n':
case 'q':
case 'u':
case 'x':{
count += 2;
break;
}
case 'c':
case 'f':
case 'i':
case 'l':
case 'o':
case 'r':
case 'v':
case 'y':{
count += 3;
break;
}
case 's':
case 'z':{
count += 4;
break;
}
}
}
cout << count;
}
2.2 打表
代码
#include <bits/stdc++.h>
using namespace std;
int main() {
string str;
getline(cin, str);
unordered_map<char, int> charValues = {
{'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}, {' ', 1}
};
int count = 0;
for (char ch : str) {
count += charValues[ch];
}
cout << count;
return 0;
}
2.3 自动打表
代码
#include <iostream>
#include <string>
using namespace std;
int clicks[256] = { 0 };
void init_clicks()
{
const string keyboard[12] = {
"", "abc", "def",
"ghi", "jkl", "mno",
"pqrs", "tuv", "wxyz",
"*", " ", "#"};
for (int i = 0; i < 12; ++i)
for (int j = 0; j < keyboard[i].length(); ++j)
clicks[keyboard[i][j]] = j + 1;
}
int main()
{
init_clicks();
string s;
getline(cin, s);
int count = 0;
for (int i = 0; i < s.length(); ++i)
count += clicks[s[i]];
cout << count;
}

浙公网安备 33010602011771号