题目描述
一只名叫 CZM 的蚱蜢在草地上高兴地蹦跶。一不小心,他的诺基亚 3310 掉进了水坑里。现在,他的手机所有的数字键都崩溃了。当我们按下其中某一个按钮时,就如同我们在按另一个键一样。幸运的是,没有两个键是相同的。所以,CZM 仍然可以拼写所有的字母。
CZM 正在一个一个地尝试,看看每个按键能按出什么字符。现在他想给他的朋友发短信,可是,他被这个错乱的按键弄糊涂了,所以请你帮忙发短信。对于手机原来的按键,这里有一个简短的描述。

这是一个诺基亚手机的按键面板。该图像显示按键上(在没有落入水坑时的手机)可以获得的字母的键。例如,如果我们要获取字母‘a’,我们将按“2 键”一次,如果我们想要字母‘b’,我们将按“2 键”两次。如果我们想从同一个键连续写两个不同的字母,我们必须按‘#’间隔。例如,我们要写字符串“klor”,我们将要按键的顺序如下:“55#555666777”。
输入
从文件 mobitel.in 中读入数据。
第 1 行输入包含 9 个数字。第一个整数表示 “键 1”实际按出的数字,第二个整数表示“键 2”实际按出的数字,第三个整数表示“键 3”实际按出的数字,以此类推(且保证数字 1~9,每个数字当且仅当出现一次)。因为他是一只蚱蜢,所以 CZM 没有使用“*”和“0”键。“#”键没有坏掉。
第 2 行输入一个字符串 S,由英文小写字母组成。
输出
输出到文件 mobitel.out 中。
输出共一行一个字符串,即输出 CZM 的信息,你需要按键的数字序列。
样例数据
输入 #1
2 3 4 5 6 7 8 9 1 klor
输出 #1
44#444555666
输入 #2
7 8 9 1 2 3 6 5 4 djevojka
输出 #2
68662227778#885
输入 #3
9 8 7 6 5 4 3 2 1 skakavac
输出 #3
33335585582228#888
数据范围限制
对于 100% 的数据:1≤|S|≤100,|S| 表示字符串 S 的长度。
这道题不难,我们只要先求出这个字母原本所代表的数字,再循环一下,找到并输出代替他的数字就行了,如果和上一给数字相同,就先输出#,记住,要注意是,s和z是第四个字母,我比赛时就差点被坑了
以下是AC代码:
#include<bits/stdc++.h>
using namespace std;
int l,jl,a[15],jl1;
string b;
void cl(int x)
{
int y=((b[x]-'a'+1)%3);
if(jl==7&&b[x]=='s')
{
y+=3;
}
else if(jl>=8)
{
y=(b[x]-'a')%3;
}
if(b[x]=='z')
{
y=4;
}
if(y==0)
{
y=3;
}
for(int i=1;i<=9;i++)
{
if(a[i]==jl)
{
jl=i;
break;
}
}
if(jl==jl1)
{
printf("#");
}
for(int i=1;i<=y;i++)
{
printf("%d",jl);
}
}
int main()
{
freopen("mobitel.in","r",stdin);
freopen("mobitel.out","w",stdout);
for(int i=1;i<=9;i++)
{
scanf("%d",&a[i]);
}
cin>>b;
l=b.size();
for(int i=0;i<l;i++)
{
if(b[i]>='a'&&b[i]<='c') jl=2;
else if(b[i]>='d'&&b[i]<='f') jl=3;
else if(b[i]>='g'&&b[i]<='i') jl=4;
else if(b[i]>='j'&&b[i]<='l') jl=5;
else if(b[i]>='m'&&b[i]<='o') jl=6;
else if(b[i]>='p'&&b[i]<='s') jl=7;
else if(b[i]>='t'&&b[i]<='v') jl=8;
else if(b[i]>='w'&&b[i]<='z') jl=9;
cl(i);
jl1=jl;
}
return 0;
}
2347

被折叠的 条评论
为什么被折叠?



