原题


大家有木有看过带谍战剧?里面多数都有发电报的情节吧,有木有感觉滴滴答答地发报特别酷?
发报的那个东西,学名叫做“电键”,如图:


电键按下去之后,电路接通,就会发出声音,长短不同的声音组合,就形成了不同的编码,可以表示不同的信息~
汉字个数太多,所以汉字的编码是很复杂的。但是英文字母比较少,编码就容易多了
我们今天来研究一种国际通用的电报编码——莫尔斯码。
我们用“滴(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
-.-. --.-|-.-. --.-|-.-. --.-|-… .|-… -… … … .-… .-|-… -… … … .-… .-|-.-

题意

给定字符与莫尔斯码的对应关系,要求将文本转换成编码,或将编码转换成文本。
和去年天梯赛的AI代码一样,忠实题意模拟即可

关系存储

这里可以用一个一维字符数组存单个字符,然后二维数组存莫尔斯码,但这在查找比较的时候较复杂,速度也慢。这里我用map存储,不过存入时代码比较多。

 map<char , string>m1;map<string , string>m2;freopen("output.txt" , "r" , stdin);string s1 , s2;while(cin>>s1>>s2){cout<<"m1["<<"'"<<s1<<"']"<<" = "<<"\""<<s2<<"\";"<<endl;cout<<"m2["<<"\""<<s2<<"\"]"<<" = "<<"\""<<s1<<"\";"<<endl;}

这里直接运行上面这段程序,再将上面的关系复制进来,最后将输出的内容拷贝到编译器即可。

判断文本或者是编码

这里用“|”去区分文本或者是编码恐怕有失偏颇,万一编码只有一组岂不是同样没有“|”
所以采用“.”和“-”来进行区分。注意到有的编码只有“.”有的编码只有“-”,所以如果是文本的话,应该同时不含有“.”和“-”。

 bool flag = false; if(str.find(".") == string :: npos && str.find("-") == string :: npos)flag = true;

这里可以用string 的find函数,string::npos就是空的意思。通过flag的值决定进行何种转换

文本转编码


因为刚刚用了map进行存储,所以只需要遍历输入进来的字符串即可,碰到字符直接输出对应的编码,碰到空格就输出"|",这里尤其注意什么时候输出空格。得是下一个字符不是字母才能输出空格,并且得保证判断的时候下标不越界,最后输出换行。

 for(int i = 0 ; i < str.length() ; i++){if(str[i] != ' '){cout<<m1[str[i]];if(i + 1 < str.length() && str[i + 1] != ' ')cout<<" ";}else  cout<<"|";}cout<<endl;

编码转文本


这里就比较复杂了,因为题目输入的是一整串文本,而我们需要的是其中一段一段才更好处理。这里可以用c++的sstream或者是c的ssprint,用于字符串的二次读入储存。我们观察到不同组的编码通过“|”分隔,但实际上我们处理的时候并没有很大价值,如果是换成空格分割会好些,但换成空格又和原本的空格产生歧义,所以这里考虑塞进一个不相干的字符进去,用于区别是否是同种字符,这里我采用“a”。

 while(str.find("|") != string :: npos)str.replace(str.find("|") , 1 , " a ");stringstream ss(str);int k = 0;while(ss >> str)s[k++] = str;

这里把“|”替换成“ a ”,再把得到的字符串输入进一个字符串数组里。
举个例子,比如:-.-. --.-|-.-. --.-|-.-. --.-|
处理后

  1. s[0] = “-.-”.
  2. s[1] = “–.-”
  3. s[2] = “a”
  4. s[3] = “-.-.”
  5. s[4] = “–.-”
  6. s[5] = “a”
  7. s[6] = “-.-.”
  8. s[7] = “–.-”
  9. s[8] = “a”

这样我们处理起来就很方便了,不是a的话就直接输出对应的字符,是a就输出空格

 for(int i = 0 ; i < k ; i++){if(s[i] != "a")cout<<m2[s[i]];elsecout<<" ";}cout<<endl;

代码


//7-13 莫尔斯码(Morse Code) (15分)
#include<map>
#include<cstdio>
#include<sstream>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;map<char , string>m1;
map<string , string>m2;int main()
{//  freopen("output.txt" , "r" , stdin);
//  string s1 , s2;
//  while(cin>>s1>>s2)
//  {//      cout<<"m1["<<"'"<<s1<<"']"<<" = "<<"\""<<s2<<"\";"<<endl;
//      cout<<"m2["<<"\""<<s2<<"\"]"<<" = "<<"\""<<s1<<"\";"<<endl;
//  }m1['A'] = ".-";m2[".-"] = "A";m1['B'] = "-...";m2["-..."] = "B";m1['C'] = "-.-.";m2["-.-."] = "C";m1['D'] = "-..";m2["-.."] = "D";m1['E'] = ".";m2["."] = "E";m1['F'] = "..-.";m2["..-."] = "F";m1['G'] = "--.";m2["--."] = "G";m1['H'] = "....";m2["...."] = "H";m1['I'] = "..";m2[".."] = "I";m1['J'] = ".---";m2[".---"] = "J";m1['K'] = "-.-";m2["-.-"] = "K";m1['L'] = ".-..";m2[".-.."] = "L";m1['M'] = "--";m2["--"] = "M";m1['N'] = "-.";m2["-."] = "N";m1['O'] = "---";m2["---"] = "O";m1['P'] = ".--.";m2[".--."] = "P";m1['Q'] = "--.-";m2["--.-"] = "Q";m1['R'] = ".-.";m2[".-."] = "R";m1['S'] = "...";m2["..."] = "S";m1['T'] = "-";m2["-"] = "T";m1['U'] = "..-";m2["..-"] = "U";m1['V'] = "...-";m2["...-"] = "V";m1['W'] = ".--";m2[".--"] = "W";m1['X'] = "-..-";m2["-..-"] = "X";m1['Y'] = "-.--";m2["-.--"] = "Y";m1['Z'] = "--..";m2["--.."] = "Z";m1['0'] = "-----";m2["-----"] = "0";m1['1'] = ".----";m2[".----"] = "1";m1['2'] = "..---";m2["..---"] = "2";m1['3'] = "...--";m2["...--"] = "3";m1['4'] = "....-";m2["....-"] = "4";m1['5'] = ".....";m2["....."] = "5";m1['6'] = "-....";m2["-...."] = "6";m1['7'] = "--...";m2["--..."] = "7";m1['8'] = "---..";m2["---.."] = "8";m1['9'] = "----.";m2["----."] = "9";   int n;string str;string s[210];cin>>n;getchar();while(n--){getline(cin , str);
//      cout<<s1<<endl;bool flag = false;  if(str.find(".") == string :: npos && str.find("-") == string :: npos)flag = true;if(flag){for(int i = 0 ; i < str.length() ; i++){if(str[i] != ' '){cout<<m1[str[i]];if(i + 1 < str.length() && str[i + 1] != ' ')cout<<" ";}else  cout<<"|";}cout<<endl;}else{while(str.find("|") != string :: npos)str.replace(str.find("|") , 1 , " a ");
//          cout<<str<<endl;stringstream ss(str);int k = 0;while(ss >> str)s[k++] = str; for(int i = 0 ; i < k ; i++){if(s[i] != "a")cout<<m2[s[i]];elsecout<<" ";}cout<<endl;}}return 0;
}

PTA-莫尔斯码(字符串,模拟)相关推荐

  1. pat 7-7 莫尔斯码(Morse Code) (15分) 模拟

    大家有木有看过带谍战剧?里面多数都有发电报的情节吧,有木有感觉滴滴答答地发报特别酷? 发报的那个东西,学名叫做"电键",如图: 电键.jpg 电键按下去之后,电路接通,就会发出声音 ...

  2. 7-4 莫尔斯码(Morse Code) (25 分)

    大家有木有看过带谍战剧?里面多数都有发电报的情节吧,有木有感觉滴滴答答地发报特别酷? 发报的那个东西,学名叫做"电键",如图: 电键.jpg 电键按下去之后,电路接通,就会发出声音 ...

  3. 莫尔斯码(Morse Code)

    大家有木有看过带谍战剧?里面多数都有发电报的情节吧,有木有感觉滴滴答答地发报特别酷? 发报的那个东西,学名叫做"电键",如图: 电键.jpg 电键按下去之后,电路接通,就会发出声音 ...

  4. 7-44 莫尔斯码(Morse Code) (15分)

    电键按下去之后,电路接通,就会发出声音,长短不同的声音组合,就形成了不同的编码,可以表示不同的信息~ 汉字个数太多,所以汉字的编码是很复杂的.但是英文字母比较少,编码就容易多了 我们今天来研究一种国际 ...

  5. CF5A Chat Server's Outgoing Traffic(字符串模拟,find函数的应用)难度⭐

    题意翻译 Polycarp正在开发一个名为"Polychat"的新项目.按照IT的现代倾向,他决定,这个项目也应该包含聊天.为了实现这一目标,Polycarp在笔记本电脑前花费了几 ...

  6. 剑指offer:汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果。对于一个给定的字符序列S,请你把其循环左移K位后的序列输出。

    汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果.对于一个给定的字符序列S,请你把其循环左移K位后的序列输出.例如,字符序列S="abc ...

  7. 【Luogu1580】yyy loves Easter_Egg I(纯字符串模拟)

    problem 保持队形(我们认为只要这一句内含有且恰好含有一次@,@的人和上一句话一样就算为队形) 若艾特的人与第一个人不同,就算队形被打破,油炸失败.若这个人在队形被打破之前出来吱声了,或者就是他 ...

  8. 抢红包 html 模板,微信抢红包源码和模拟demo

    微信抢红包源码和模拟demo 资源下载此资源下载价格为3D币,请先登录 资源文件列表 K_wechat/.classpath , 475 K_wechat/.project , 844 K_wecha ...

  9. POJ 3095 Linear Pachinko 字符串模拟

    http://poj.org/problem?id=3095 简单字符串模拟 Linear Pachinko Time Limit:1000MSMemory Limit:65536K Descript ...

  10. 【vue生成二维码】1.将后端返回的二维码字符串生成二维码;2.下载功能

    vue使用qrcode插件 一.只展示一张图的效果 一.效果图: 二.具体代码: 1.安装 npm i qrcodejs2 --save 2.在页面使用 2.1.html <div id=&qu ...

最新文章

  1. 2018-06-02笔记
  2. mysql 5.6升级8.0_Mysql数据库从5.6.28版本升到8.0.11版本部署项目时遇到的问题及解决方法...
  3. 如何查看node的版本及安装的位置?
  4. 单元测试——Winfrom
  5. iOS: 环信的推送
  6. 资源放送丨《OGG日常运维及故障处理》PPT视频
  7. 微信小程序-仿淘宝(附真机测试图)(持续更新中。。。)
  8. laravel 图片上传 intervention/image
  9. z11 max android 6.0,努比亚Z11Max 安卓6.0 魅族Flyme6刷机包 最新6.7.12.29R紫火版 20180108更新...
  10. 安装CAD2006出现html,Win7系统安装cad2006出现已终止CAD2006-Simplifieng安装怎么办
  11. 使用PS制作毛玻璃效果
  12. 慢内容广告:品牌增长的长线主义
  13. 启用计算机无线网络连接,哪位清楚笔记本电脑如何启用无线网络连接
  14. leetcode 算法-乘积最大子序列-152
  15. JQUREY DOM 操作详解
  16. Word字体大小对照换算表(字号、磅、英寸、像素)
  17. python太阳花画法_python太阳花绘制
  18. 定期修改网管服务器和,2013武鸣县气象局机房安全管理制度
  19. 计算智能——粒子群算法的寻优算法
  20. 用Tomcat、SQLite实现动态网页——沈阳航空航天大学生产实习

热门文章

  1. Linux中防火墙firewalld
  2. TTL肖特基触发器是什么?
  3. 设计模式循序渐进(9)解释器模式 Interpreter
  4. [USACO 2017 Dec P]Greedy Gift Takers-----二分+推理
  5. execl筛选去重_Excel去除重复项的三种常用技巧
  6. 前端面试精华帖:100个问题如果你回答出80个,那么请把你的简历给我
  7. nopCommerce3.9简体中文语言包(nopCommerce3.9 language)
  8. 常见的机器学习数据挖掘知识点
  9. 2021年转行产品经理十大常见问题汇总
  10. 解决Windows Explorer 奇怪的卡顿问题