一:题目

A-Z0-9分别对应一些莫尔斯电码字符串
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 --..
------
.-----
..---
...--
....-
.....
-....
--...
---..
----.
现在给出一系列单词
AN
EARTHQUAKE
EAT
GOD
HATH
IM
READY
TO
WHAT
WROTH
题目给出一系列莫尔斯电码(以空格隔开),我们按照之前的A-Z-9去对这些莫尔斯电码进行解析(必须匹配我们上面提供的单词)
匹配形式有:
精确匹配--一个莫尔斯电码串只有一个单词匹配
多重匹配--一个莫尔斯电码可以精确匹配多个单词,我们只取第一个匹配的单词,并在单词后面加上“!”
模糊匹配--由于题目提供的莫尔斯电码串可能在传输中被截断,所以会出现该莫尔斯电码长度比原来应该匹配的单词短,我们找到长度最匹配(最相近)的单词进行输出,并在后面加上“?”

(一)样例输入

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 --..
------
.-----
..---
...--
....-
.....
-....
--...
---..
----.
*        //代表结束此类输入
AN       //题目提供我们可以匹配的单词
EARTHQUAKE
EAT
GOD
HATH
IM
READY
TO
WHAT
WROTH
*        //代表结束此类输入
.--.....-- .....--....  //这是我们要匹配的莫尔斯电码串,每个莫尔斯电码串用空格或者换行隔开
--.----.. .--.-.----..
.--.....-- .--.
..-.-.-....--.-..-.--.-.
..-- .-...--..-.--
---- ..--
*

(二)样例输出

WHAT
HATH
GOD
WROTH?
WHAT
AN
EARTHQUAKE
EAT!
READY
TO
EAT!

二:代码实现

使用C语言实现过于麻烦,所以使用C++中map进行数据映射,更加方便
#include <iostream>
#include <string>
#include <map> using namespace std; map<char, string> CM;  //保存字符--莫尔斯电码
map<string, string> WM;  //保存单词--莫尔斯电码

获取字符和单词的莫尔斯电码映射

void getMorseMap()
{
int i;
char ch;
string Morse,Words;
while ((cin >> ch)&&ch!='*')
{
cin >> Morse;
CM.insert(pair<char, string>(ch, Morse));
} while ((cin>>Words)&&Words[]!='*')
{
Morse = "",i=;
while (Words.length()!=i)
Morse += (*CM.find(Words[i++])).second;
WM.insert(pair<string, string>(Words, Morse));
}
}

比较两个莫尔斯电码的长度,返回匹配不成功的长度差

int getComplen(string src, string obj)
{
int i = ;
for (i = ; src[i] == obj[i]; i++);
return obj.length() - i;
}

进行莫尔斯电码匹配单词

void printMorseData()
{
bool flag = false;
string MorseWord;
int min,len;
map<string, string>::iterator iter, ret;
while (cin >> MorseWord&&MorseWord[] != '*')
{
flag = false;
//精确匹配
for (iter = WM.begin(); iter != WM.end();iter++)
if (iter->second == MorseWord)
if (flag) cout << "!";
else cout << iter->first, flag = true;
//模糊匹配 由于摩斯密码只能截断,所以获取的摩斯密码只能比原来的数据短
if (!flag)
{
min = ;
for (iter = WM.begin(); iter != WM.end(); iter++)
if (iter->second.length() > MorseWord.length())
{
len = getComplen(MorseWord, iter->second);
if (len < min)
min = len, ret = iter;
}
cout << ret->first << "?";
}
cout << endl;
}
}

主函数

void main()
{
FILE* fp = freopen("data6.in", "r", stdin);
freopen("data6.out", "w", stdout); ios::sync_with_stdio(false);  //使得cin cout的效率同scanf和printf一样 getMorseMap(); //获取映射数据
printMorseData(); //打印摩斯数据 freopen("CON", "r", stdin);
freopen("CON", "w", stdout);
}

算法习题---4-6莫尔斯电码(UVa508)的更多相关文章

  1. 算法提高 9-3摩尔斯电码 map

    算法提高 9-3摩尔斯电码 时间限制:1.0s   内存限制:256.0MB     问题描述 摩尔斯电码破译.类似于乔林教材第213页的例6.5,要求输入摩尔斯码,返回英文.请不要使用"z ...

  2. 【算法习题】数组中任意2个(3个)数的和为sum的组合

    题1.给定一个int数组,一个数sum,求数组中和为sum的任意2个数的组合 @Test public void test_find2() { int[] arr = { -1, 0, 2, 3, 4 ...

  3. Leetcode 804. Unique Morse Code Words 莫尔斯电码重复问题

    参考:https://blog.csdn.net/yuweiming70/article/details/79684433 题目描述: International Morse Code defines ...

  4. July 算法习题 - 字符串4(全排列和全组合)

    https://segmentfault.com/a/1190000002710424 思想:当前层各节点首元素不同,则各节点的剩余元素也不同:下一层节点交换范围为首元素以外的元素 全排列算法: vo ...

  5. 算法习题---4-9数据挖掘(Uva1591)

    一:题目 这是最懵逼的一道题,什么鬼......... [刷题]算法竞赛入门经典(第2版) 4-9/UVa1591 - Data Mining(详细题目看这个吧,不想多说) 二:代码实现 #defin ...

  6. tarjan算法 习题

    dfs树与tarjan算法 标签(空格分隔): 517coding problem solution dfs树 tarjan Task 1 给出一幅无向图\(G\),在其中给出一个dfs树\(T\), ...

  7. 【算法习题】正整数数组中和为sum的任意个数的组合数

    1.递归实现(参考:https://blog.csdn.net/hit_lk/article/details/53967627) public class Test { @org.junit.Test ...

  8. 蓝桥杯 算法提高 9-3摩尔斯电码 _c++ Map容器用法

    //****|*|*-**|*-**|--- #include <iostream> #include <map> #include <vector> #inclu ...

  9. 算法习题-FFT

    Q1(hdu1402): 给出两个很大的数字A,B,计算二者乘积. 分析:这个题目java应该能过,用FFT做能够加速计算.这里将字符串A按权(10进制)展开,前面的系数就是多项式的系数,这样就构造出 ...

随机推荐

  1. python requests包的基本使用

    Requests 安装requests模块: D:\Install\Python36>pip3 install requests 请求方式 #coding:utf-8 import reques ...

  2. java学习(1) ----getMethod()和getDeclaredMethod()的区别(转)

    转自: https://blog.csdn.net/qq_36443736/article/details/82890011 getMethod():获取自身能用所有的public公共方法.1.类本身 ...

  3. SegNet网络的Pytorch实现

    1.文章原文地址 SegNet: A Deep Convolutional Encoder-Decoder Architecture for Image Segmentation 2.文章摘要 语义分 ...

  4. VUE this.$http.post 与后端flask 数据交互

    背景: 小鱼第一次前端用的VUE,然后前后端的交互调了几次,记录下来留给自己下次使用 前端 通过  form.XXX 获取数据,代码: <template> <el-form ref ...

  5. MyCat(1.1)Mycat基本介绍

    [1]学习目的 (1)掌握在数据库负载增大时的处理方法 (2)理解mycat的基础概念 (3)掌握mycat基础配置和监控方法 [2]Mycat的前世今生 官网:http://mycat.io/ 下载 ...

  6. python - pycharm 配置虚拟环境出现的中文命名问题

    说一个困扰我很久的问题,当使用 pycharm 配置新的虚拟环境想要与之前的环境隔离的时候,正常的点击 New Project 创建项目时,不勾选 Inherit global site-packag ...

  7. 物联网之窄带物联网(NB-IOT)

    NB-IoT即窄带物联网(Narrow Band Internet of Things),NB-IOT构建在蜂窝网络之上,只消耗大约180KHZ的带宽,可直接部署于GSM(2G).UMTS(3G).L ...

  8. 简述 CGI、FastCGI和php-FPM的区别

    1.CGI是联系webserver 跟php解析器的一个桥梁 2.FastCGI是CGI改良的版本 3.php-FPM 是FastCGI 的进程管理器

  9. javascript权威指南第21章 Ajax和Comet

    function createXHR(){ if(typeof XMLHttpRequest !='undefined'){ return new XMLHttpRequest(); }else if ...

  10. 简单聊聊TiDB中sql优化的一个规则---左连接消除(Left Out Join Elimination)

    我们看看 TiDB 一段代码的实现 --- 左外连接(Left Out Join)的消除; select 的优化一般是这样的过程: 在逻辑执行计划的优化阶段, 会有很多关系代数的规则, 需要将逻辑执行 ...