(纪中)2244. mobitel

57 篇文章 0 订阅

(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 1S100


解题思路
暴力模拟


代码

#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]]);
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值