乱键手机(mobitel)

                         

题目描述

一只名叫 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;
}

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值