题解:洛谷 P1765 手机
【题目来源】
【题目描述】
一般的手机的键盘是这样的:

要按出英文字母就必须要按数字键多下。例如要按出 \(x\) 就得按 \(9\) 两下,第一下会出 \(w\),而第二下会把 \(w\) 变成 \(x\)。\(0\) 键按一下会出一个空格。
你的任务是读取若干句只包含英文小写字母和空格的句子,求出要在手机上打出这个句子至少需要按多少下键盘。
【输入】
一行句子,只包含英文小写字母和空格,且不超过 \(200\) 个字符。
【输出】
一行一个整数,表示按键盘的总次数。
【输入样例】
i have a dream
【输出样例】
23
【算法标签】
《洛谷 P1765 手机》 #模拟# #字符串# #枚举# #NOI导刊#
【代码详解】
#include <bits/stdc++.h> // 包含标准库头文件(万能头文件)
using namespace std; // 使用标准命名空间
int main()
{
string s; // 定义字符串:存储输入的字符串
int ans = 0; // 定义变量:存储最终按键次数总和
int m[300]; // 定义数组:存储每个字符对应的按键次数
int mark = 1; // 定义变量:辅助赋值变量
getline(cin, s); // 读取整行输入(包含空格)
// 初始化字母a-r的按键次数(循环1-3)
for (int i = 'a'; i <= 'r'; i++)
{
m[i] = mark; // 赋值当前字母的按键次数
mark++; // 辅助变量递增
if (mark == 4) // 每3个字母循环一次
mark = 1;
}
// 特殊处理字母s、z和空格
m['s'] = 4; // 字母s需要按4次
m['z'] = 4; // 字母z需要按4次
m[' '] = 1; // 空格需要按1次
mark = 1; // 重置辅助变量
// 初始化字母t-y的按键次数(循环1-3)
for (int i = 't'; i <= 'y'; i++)
{
m[i] = mark; // 赋值当前字母的按键次数
mark++; // 辅助变量递增
if (mark == 4) // 每3个字母循环一次
mark = 1;
}
// 计算字符串中所有字符的按键次数总和
for (int i = 0; i < s.length(); i++)
{
ans += m[s[i]]; // 累加当前字符的按键次数
}
cout << ans; // 输出总按键次数
return 0; // 程序正常结束
}
【运行结果】
i have a dream
23
浙公网安备 33010602011771号