打卡信奥刷题(483)用C++信奥P6401[普及组/提高] [COCI2014-2015#2] MOBITEL
[COCI2014-2015#2] MOBITEL
题目描述
蚱蜢 Marko 高兴地在草地上跳来跳去。他不小心,他的手机掉进了水坑。他的手机现在触键弄湿了,键盘的工作方式完全不可预知!所有的数字键都坏了。当我们按下其中一个键时,手机就好像我们按下了另一个键一样。幸运的是,没有两个键按下后的作用是一样的,所以 Marko 仍然可以写出所有的字母。
蚱蜢 Marko 正在做一些实验以找出每个键的动作。现在他想给他的女朋友写封信。因为他只是一只蚱蜢,所以它需要你帮忙。
对于那些不记得手机的按键是如何工作的人,这里有一个简短的描述。

这张图片显示了我们可以通过按那个键(在一个没有掉进水坑的工作手机上)得到的带有字母的按键。例如,如果我们想要字母 a,我们将按一次键 2,如果我们想要字母 b,我们将按两次键 2。如果我们想连续用同一个键写两个字母,我们必须按一次键 #。例如,如果要编写字符串 klor,我们将按以下顺序按键:55#555666777。
输入格式
第一行输入包含
9
9
9 个整数。第一个整数表示按下键 1 的作用相当于原来的哪个键,第二个表示按下键 2 的作用相当于原来的哪个键,第三个表示表示按下键 3 的作用相当于原来的哪个键,依此类推。马尔科不会使用 * 和 0 键。键 # 不会坏。
第二行输入包含一个字符串 s s s,该字符串仅由英文字母表中的小写字母组成,表示蚱蜢 Marko 想要打出的字符串。
输出格式
第一行也是唯一一行,输出可以打印出蚱蜢 Marko 所想要的字符串需要按的键序列。
样例 #1
样例输入 #1
2 3 4 5 6 7 8 9 1
klor
样例输出 #1
44#444555666
样例 #2
样例输入 #2
7 8 9 1 2 3 6 5 4
djevojka
样例输出 #2
68662227778#885
样例 #3
样例输入 #3
9 8 7 6 5 4 3 2 1
skakavac
样例输出 #3
33335585582228#888
提示
样例 1 说明
所有键的功能都向右移动一个位置,因此输出与题目中的示例语句中的示例略有不同。
数据规模与约定
令 ∣ s ∣ |s| ∣s∣ 为字符串 s s s 的长度,则对于 100 % 100\% 100% 的数据,都有 1 ≤ ∣ s ∣ ≤ 100 1\le |s|\le 100 1≤∣s∣≤100。
说明
题目译自 COCI2014-2015 CONTEST #2 T1 MOBITEL。
C++实现
#include<bits/stdc++.h>
using namespace std;
int a[10];
string s;
int lst;
int c[27]=
{0,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};
int sum[27]=
{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};
void init(){
for(int i=1;i<=9;i++){
int x;cin>>x;
a[x]=i;
}
cin>>s;
}
int main(){
init();
for(int i=0;i<s.size();i++){
int num=s[i]-‘a’+1;
if(lst==c[num])cout<<‘#’;
lst=c[num];
for(int j=1;j<=sum[num];j++)
cout<<a[c[num]];
}
return 0;
}

后续
接下来我会不断用C++来实现信奥比赛中的算法题、GESP考级编程题实现、白名单赛事考题实现,记录日常的编程生活、比赛心得,感兴趣的请关注,我后续将继续分享相关内容
更多推荐



所有评论(0)