PTA 莫尔斯码(Morse Code)

大家有木有看过带谍战剧?里面多数都有发电报的情节吧,有木有感觉滴滴答答地发报特别酷?

发报的那个东西,学名叫做“电键”,如图:

电键.jpg




电键按下去之后,电路接通,就会发出声音,长短不同的声音组合,就形成了不同的编码,可以表示不同的信息~

汉字个数太多,所以汉字的编码是很复杂的。但是英文字母比较少,编码就容易多了

我们今天来研究一种国际通用的电报编码——莫尔斯码。

我们用“滴(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;
}
  • 7
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值