一:题目

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. SHELL编程基础01

    首先shell是在linux下运行的一种环境,它是以shell脚本来运行的,学会了它基本可以解决任何问题,也可以用shell脚本开发. 和java,python的相比,其弱类型的语言没有那么复杂的结构 ...

  2. Mybatis的一级缓存机制简介

    1.接口 public interface MemberMapperCache { public Members selectMembersById(Integer id); } 2.配置文件xml ...

  3. appium问题汇总(持续更新。。。)

    WEBVIEW_unknown adb版本较低,adb 1.0.32版本不支持安卓8.x版本,更新adb版本后正常 Install homebrew ruby -e "$(curl -fsS ...

  4. Sql Server (MSSQLSERVER) 服务无法启动

    北京的冬天特别干燥,大清早的一同事就和服务器擦出了爱的火花,结果没想到竟导致服务器无法开机了,这可尴尬了,代码可都在服务器上托管着呢,一会还等着上线呢,必须得修啊.他们说是主板坏了,就另外找了一台电脑 ...

  5. 005__C#修改软件图标

    (一)项目右键属性 (二)应用程序-->图标          图标转换:http://www.faviconico.org/ (三)窗体右键属性更改窗体里面的图标 (四)修改名字

  6. git致命错误汇总

    1.  拒绝合并无关历史 fatal: refusing to merge unrelated histories 解决办法: git pull origin master --allow-unrel ...

  7. Navicat连接Oracle报ORA-12737错误

    替换oci.dll 文件分享百度网盘:链接:https://pan.baidu.com/s/1wayojGlKcgdMRZTvBqAUgw 密码:3d6j 把下载的文件放到Navicat文件夹里,然后 ...

  8. REST与RPC区别

    OSI网络七层模型 第一层:应用层.定义了用于在网络中进行通信和传输数据的接口: 第二层:表示层.定义不同的系统中数据的传输格式,编码和解码规范等: 第三层:会话层.管理用户的会话,控制用户间逻辑连接 ...

  9. Mongodb 查询优化(慢查询Profiling)

    开启慢查询Profiling Profiling级别说明 0:关闭,不收集任何数据. 1:收集慢查询数据,默认是100毫秒. 2:收集所有数据 1.通过修改配置文件开启Profiling 修改启动mo ...

  10. php+超大文件上传

    1 背景 用户本地有一份txt或者csv文件,无论是从业务数据库导出.还是其他途径获取,当需要使用蚂蚁的大数据分析工具进行数据加工.挖掘和共创应用的时候,首先要将本地文件上传至ODPS,普通的小文件通 ...