1983. 【普及組模擬賽】手機(mobile)

1983. 【普及組模擬賽】手機(mobile)

題目描述
一般的手機的鍵盤是這樣的:
在這裏插入圖片描述
要按出英文字母就必須要按數字鍵多下。例如要按出 x 就得按 9 兩下,第一下會出 w,而第二下會把 w 變成 x。 0 鍵按一下會出一個空格。
你的任務是讀取若干句只包含英文小寫字母和空格的句子,求出要在手機上打出這個句子至少需要按多少下鍵盤。

輸入
輸入文件只包含一行,表示一個句子,句子中只包含英文小寫字母和空格,且不超過200 個字符。

輸出
一行一個整數,表示按鍵盤的總次數。

樣例輸入

i have a dream

樣例輸出

23

數據範圍限制
不超過 200 個字符。

思路:
看了網上大佬,都搞了老多分支。我真想問一句:“打表不香嗎?”。
還有這道題有一個坑注意一下’\n’和’\r’的存在
換行與回車的區別:回車 (\r) 本義是光標重新回到本行開頭,r的英文return,控制字符可以寫成CR,即Carriage Return;

換行 (\n) 本義是光標往下一行(不一定到下一行行首),n的英文newline,控制字符可以寫成LF,即Line Feed。在不同的操作系統這幾個字符表現不同,比如在WIN系統下,這兩個字符就是表現的本義,在UNIX類系統,換行\n就表現爲光標下一行並回到行首,在MAC上,\r就表現爲回到本行開頭並往下一行,至於ENTER鍵的定義是與操作系統有關的。

#include<cstdio>
#include<iostream>
#include<cmath>
#include<cstring>
#include<string>
#include<algorithm>
#include<vector>
#define fre(x) freopen(#x".in","r",stdin),freopen(#x".out","w",stdout);
using namespace std;
const int MAX=2147483647;
const int N=1e6;
int a[50]={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},ans;
string s;
int main()
{
	//fre(mobile);
	getline(cin,s);
	int l=s.size();
	for(int i=0;i<l;i++)
	{
		if(s[i]==' ') ans++;
		if(s[i]>='a'&&s[i]<='z') ans+=a[s[i]-'a'];//因爲有‘\r’所以這裏不能用else
	}
	printf("%d\n",ans);
	return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章