(File IO): input:mobitel.in output:mobitel.out
时间限制: 1000 ms 空间限制: 262144 KB 具体限制
Goto ProblemSet
题目描述
一只名叫马可的蚱蜢在草地上高兴地蹦跶。一不小心, 他的诺基亚
3310
3310
3310掉进了水坑里。现在,他的手机变得很滑稽。键盘湿了,而且完全按照不可预测的方式按出不符的字符。所有的数字键都崩溃了。当我们按下其中某一个按钮时,就如同我们在按另一个键一样。幸运的是,没有两个键是相同的。所以,马可仍然可以拼写所有的字母。
马可正在一个一个地尝试,看看每个按键能按出什么字符。现在他想给他的女朋友发短信,可是,他被这个错乱的按键弄糊涂了,所以请你帮忙发短信。对于手机原来的按键,这里有一个简短的描述。
这是一个诺基亚手机的按键面板。该图像显示按键上(在没有落入水坑时的手机)可以获得的字母的键。例如,如果我们要获取字母 ‘ a ’ ‘a’ ‘a’,我们将按“ 2 2 2键”一次,如果我们想要字母 ‘ b ’ ‘b’ ‘b’,我们将按“ 2 2 2键”两次。如果我们想从同一个键连续写两个不同的字母,我们必须按‘#’间隔。例如,我们要写字符串 “ k l o r ” “klor” “klor”,我们将要按键的顺序如下: “ 55 “55 “55# 555666777 ” 555666777” 555666777”。
输入
第
1
1
1 行输入包含
9
9
9个数字。
第一个整数表示 “键
1
1
1”实际按出的数字,第二个整数表示“键
2
2
2”实际按出的数字,第三个整数表示“键
3
”
3”
3”实际按出的数字,以此类推(且保证数字
1
9
1~9
1 9,每个数字当且仅当出现一次)。因为他是一只蚱蜢,所以马可没有使用
“
∗
”
“*”
“∗”和
“
0
”
“0”
“0”键。KaTeX parse error: Expected 'EOF', got '#' at position 2: “#̲”键没有坏掉。
第
2
2
2 行输入一个字符串
S
S
S,由英文小写字母组成。
输出
输出共一行一个字符串,即输出马可的信息,你需要按键的数字序列。
样例输入
【输入样例1】
2 3 4 5 6 7 8 9 1
klor
【输入样例2】
7 8 9 1 2 3 6 5 4
djevojka
【输入样例3】
9 8 7 6 5 4 3 2 1
skakavac
样例输出
【输出样例1】
44#444555666
【输出样例2】
68662227778#885
【输出样例3】
33335585582228#888
数据范围限制
对于
100
100%
100的数据:
1
≤
∣
S
∣
≤
100
1≤|S|≤100
1≤∣S∣≤100;
解题思路
暴力模拟
代码
#include<iostream>
#include<cstring>
#include<string>
#include<cstdio>
#include<algorithm>
#include<iomanip>
#include<cmath>
#include<map>
using namespace std;
int a[30]={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};//a[i]表示想按出第i个字母需要按的键
int b[30]={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};//b[i]表示想按出第i个字母需要按键的次数
int f[10],n,l,x;//f[i]表示现在想打出数字i要按的键
string s;
int main()
{
freopen("mobitel.in","r",stdin);
freopen("mobitel.out","w",stdout);
for(int i=1;i<=9;i++)
{
scanf("%d",&x);
f[x]=i;
}
cin>>s;
for(int i=0;i<s.size();i++){//扫描字符串,处理想打的每一个字母
n=s[i]-'a'+1;
if(l==a[n])printf("#");//如果上一个按的键和这次要按的键是一样的,就根据题意输出一个#
l=a[n];//把l更新
for(int j=1;j<=b[n];j++)
printf("%d",f[a[n]]);
}
}