大家有木有看过带谍战剧?里面多数都有发电报的情节吧,有木有感觉滴滴答答地发报特别酷?
发报的那个东西,学名叫做“电键”,如图:
电键按下去之后,电路接通,就会发出声音,长短不同的声音组合,就形成了不同的编码,可以表示不同的信息~
汉字个数太多,所以汉字的编码是很复杂的。但是英文字母比较少,编码就容易多了
我们今天来研究一种国际通用的电报编码——莫尔斯码。
我们用“滴(Di~)”来模拟电键短按发出的声音,用一个点(dot)表示: .
用“答(Da~)”来模拟电键长按发出的声音,用一个短划(dash)表示: -
英文字母和数字的莫尔斯码是:
- A .-
- B -...
- C -.-.
- D -..
- E .
- F ..-.
- G --.
- H ....
- I ..
- J .---
- K -.-
- L .-..
- M --
- N -.
- O ---
- P .--.
- Q --.-
- R .-.
- S ...
- T -
- U ..-
- V ...-
- W .--
- X -..-
- Y -.--
- Z --..
- 0 -----
- 1 .----
- 2 ..---
- 3 ...--
- 4 ....-
- 5 .....
- 6 -....
- 7 --...
- 8 ---..
- 9 ----.
例如求救信号 `SOS` 的莫尔斯码就是: `... --- ...` (每个字母的编码中间空一格)
现在请将输入的编码转成文本、将输入的文本转成编码。
输入格式:
第一行为一个正整数N
,
接下来N
行,每行为不超过200个字符的文本或者编码。
我们把连续的一串字母或数字的组合称之为一个“单词”,输入的文本格式是:每个单词之间空一格,文本的首末两端没有空格,例如CQ CQ
,文本仅有大写字母、数字、空格组成。
输入的编码的格式是:每个单词内的字母编码或数字编码之间空一格,每个单词之间用|
分隔,例如 -.-. --.-|-.-. --.-
(文本 CQ CQ
的编码)
输出格式:
对每一行输入的文本或编码,采用相对应的格式,在一行中对应给出其编码或文本。
输入样例:
2
-.-. --.-|-.-. --.-|-.-. --.-|-.. .|-... -.. ..... .... .-.. .-|-... -.. ..... .... .-.. .-|-.-
CQ CQ CQ DE BD5HLA BD5HLA K
输出样例:
CQ CQ CQ DE BD5HLA BD5HLA K
-.-. --.-|-.-. --.-|-.-. --.-|-.. .|-... -.. ..... .... .-.. .-|-... -.. ..... .... .-.. .-|-.-
解题思路:先把对应关系用map存下来,然后如果是字母那么字符流流一下,然后输出对应字符,如果是字符,那么跑for存一下到sr里面,然后不是字符的时候输出对应字母就可以了!!
#include<bits/stdc++.h>
using namespace std;
map<string,char> mp;
map<char,string> mpp;
void init(){
mpp['A']=".-";mpp['B']="-...";mpp['C']="-.-.";mpp['D']="-..";mpp['E']=".";mpp['F']="..-.";mpp['G']="--.";mpp['H']="....";mpp['I']="..";mpp['J']=".---";mpp['K']="-.-";mpp['L']=".-..";mpp['M']="--";mpp['N']="-.";mpp['O']="---";mpp['P']=".--.";mpp['Q']="--.-";mpp['R']=".-.";mpp['S']="...";mpp['T']="-";mpp['U']="..-";mpp['V']="...-";mpp['W']=".--";mpp['X']="-..-"; mpp['Y']="-.--";mpp['Z']="--..";mpp['0']="-----";mpp['1']=".----"; mpp['2']="..---";mpp['3']="...--";mpp['4']="....-";mpp['5']=".....";mpp['6']="-....";mpp['7']="--...";mpp['8']="---..";mpp['9']="----.";mp[".-"]='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';mp["-----"]='0';mp[".----"]='1';mp["..---"]='2';mp["...--"]='3';mp["....-"]='4';mp["....."]='5';mp["-...."]='6';mp["--..."]='7';mp["---.."]='8';mp["----."]='9';
}
int main(){
init();
int n;cin>>n;
getchar();
while(n--){
string s;
getline(cin,s);
string sr="";
if(isalpha(s[0])!=0){
stringstream zfl(s);//字符流
string p,a[10010];
int cnt=0;
while(zfl>>p){
a[cnt]=p;
cnt++;
}
for(int i=0;i<cnt;i++){
for(int j=0;j<a[i].size();j++){
cout<<mpp[a[i][j]];
if(j!=a[i].size()-1)cout<<" ";
}
if(i!=cnt-1)cout<<"|";
}
}else{
for(int i=0;i<s.size();i++){
if(s[i]!=32 &&s[i]!='|'){
sr+=s[i];
}else{
cout<<mp[sr];
sr="";
}
if(s[i]=='|')cout<<" ";//遇到这个说明单词结束得输出空格
}
if(sr!="")cout<<mp[sr];
}
cout<<endl;
}
return 0;
}