题目链接
#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!!!