【题解】helloworldroom#4906. 摩尔斯电码

题目链接

#4906. 摩尔斯电码http://go.helloworldroom.com:50080/problem/4906

#4906. 摩尔斯电码

题目描述

早期的电报机只能表达两种状态:电路导通和电路断开。电路导通时喇叭可以发声;断开时则不发声。如何⽤这样的机器来传递⼈类能理解的信号呢?聪明的你⼀定想到了——时间的长短可以表达不同的含义(例如长代表 1、短代表 0),然后再把 “01” 的⼆进制序列对应到字符就可以啦。摩尔斯电码就是这样⼀种早期的数字通信协议,它通过喇叭发声长短来表⽰不同的英⽂字母:
1. 点(半⾓点号 .),喇叭响 1 单位时间,读作 “滴” dit;
2. 划(半⾓减号 -),喇叭响 3 单位时间,读作 “嗒” dah;
3. 字符/单词间的停顿,字符停顿 3 单位时间,单词停顿 7 单位时间
下图列出了摩尔斯电码和英⽂字母之间的对应:

例如,⼤家可以试试把 “... --- ...” 对照上⾯的表格翻译成英⽂(空格代表字符的分割)。没错,这就是著名的 “SOS” 紧急求救信号。现在,你需要写⼀个程序把收到的摩尔斯电码翻译回英⽂字符。

输入格式

输⼊数据的第⼀⾏是⼀个整数n ,代表共有 个需要解码的英⽂字母
输⼊数据的第⼆⾏包含n 个摩尔斯电码点/划组成的字符串(字符串之间⽤⼀个空格隔开),每个字符串仅包含若⼲半⾓减号 “-” 和半⾓点号 “.”,且保证能翻译为 26 个英⽂字母中的⼀个。

输出格式

输出⼀⾏,为摩尔斯电码解码后得到的字符串。

样例数据1

input

3
... --- ...

 output

SOS

 样例数据2

input

35

- .... . --.- ..- .. -.-. -.- -... .-. --- .-- -. ..-. --- -..- .---
..- -- .--. ... --- ...- . .-. - .... . .-.. .- --.. -.-- -.. --- --.

output

 THEQUICKBROWNFOXJUMPSOVERTHELAZYDOG

 解释:“The quick brown fox jumps over the lazy dog” 是⼀个经典的包含了所有 26 个字母的句⼦。此外请注意因为⽂本宽度限制,样例第⼆⾏中的摩尔斯电码产⽣了断⾏。在实际的输⼊数据中,所有的摩尔斯电码均在同⼀⾏。

 数据规模

对于 100% 的数据  1<=n<=1000

题目分析

这道题目的解决方案并不只有一种,虽然用一下子就想到的分支语句可以,但以预处理的想法写出的代码会更加简洁。可是问题来了,如何让一个字符串对应一个字符呢?数组固然可以,不过较难实现,这里更推荐的方法是用STL中的关联容器map,具体用法见代码

题目代码

#include<bits/stdc++.h>
using namespace std;
int gcd(int a,int b){return b?gcd(b,a%b):a;}
int lcm(int a,int b){return a/(gcd(a,b))*b;}
int n;
string s,ans;
map <string,char> mp;//定义一个空map对象,其中键(相当于索引)类型为string,值类型为char

int main(){
	mp[".-"]='A';//将键".-"对应值'A'
	mp["-..."]='B';
	mp["-.-."]='C';
	mp["-.."]='D';
	mp["."]='E';
	mp["..-."]='F';
	mp["--."]='G';
	mp["...."]='H';
	mp[".."]='I';
	mp[".---"]='J';
	mp["-.-"]='K';
	mp[".-.."]='L';
	mp["--"]='M';
	mp["-."]='N';
	mp["---"]='O';
	mp[".--."]='P';
	mp["--.-"]='Q';
	mp[".-."]='R';
	mp["..."]='S';
	mp["-"]='T';
	mp["..-"]='U';
	mp["...-"]='V';
	mp[".--"]='W';
	mp["-..-"]='X';
	mp["-.--"]='Y';
	mp["--.."]='Z';
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>s;
		ans.push_back(mp[s]);
	}
	cout<<ans<<endl;
	return 0;
}

//ACplease!!!

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值