算法习题---4-6莫尔斯电码(UVa508)
一:题目
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)的更多相关文章
- 算法提高 9-3摩尔斯电码 map
算法提高 9-3摩尔斯电码 时间限制:1.0s 内存限制:256.0MB 问题描述 摩尔斯电码破译.类似于乔林教材第213页的例6.5,要求输入摩尔斯码,返回英文.请不要使用"z ...
- 【算法习题】数组中任意2个(3个)数的和为sum的组合
题1.给定一个int数组,一个数sum,求数组中和为sum的任意2个数的组合 @Test public void test_find2() { int[] arr = { -1, 0, 2, 3, 4 ...
- Leetcode 804. Unique Morse Code Words 莫尔斯电码重复问题
参考:https://blog.csdn.net/yuweiming70/article/details/79684433 题目描述: International Morse Code defines ...
- July 算法习题 - 字符串4(全排列和全组合)
https://segmentfault.com/a/1190000002710424 思想:当前层各节点首元素不同,则各节点的剩余元素也不同:下一层节点交换范围为首元素以外的元素 全排列算法: vo ...
- 算法习题---4-9数据挖掘(Uva1591)
一:题目 这是最懵逼的一道题,什么鬼......... [刷题]算法竞赛入门经典(第2版) 4-9/UVa1591 - Data Mining(详细题目看这个吧,不想多说) 二:代码实现 #defin ...
- tarjan算法 习题
dfs树与tarjan算法 标签(空格分隔): 517coding problem solution dfs树 tarjan Task 1 给出一幅无向图\(G\),在其中给出一个dfs树\(T\), ...
- 【算法习题】正整数数组中和为sum的任意个数的组合数
1.递归实现(参考:https://blog.csdn.net/hit_lk/article/details/53967627) public class Test { @org.junit.Test ...
- 蓝桥杯 算法提高 9-3摩尔斯电码 _c++ Map容器用法
//****|*|*-**|*-**|--- #include <iostream> #include <map> #include <vector> #inclu ...
- 算法习题-FFT
Q1(hdu1402): 给出两个很大的数字A,B,计算二者乘积. 分析:这个题目java应该能过,用FFT做能够加速计算.这里将字符串A按权(10进制)展开,前面的系数就是多项式的系数,这样就构造出 ...
随机推荐
- jFinal手册
JFinal官方文档 https://www.jfinal.com/ w3cschool之JFinal手册 https://www.w3cschool.cn/jfinal/
- JVM堆空间用途分析与划分依据
在上一次[https://www.cnblogs.com/webor2006/p/9876493.html]已经对JVM的内存空间的划分进行了理论化的学习,这次还是对上一次提到的理论进行进一步的补充, ...
- python-selenium安装笔记
python-selenium操作火狐,谷歌,360,ie 亲测可用,windows环境 python3.6 由于python2到2020年不进行维护所有都用python3 selenium pip ...
- 论文笔记-Deep Affinity Network for Multiple Object Tracking
作者: ShijieSun, Naveed Akhtar, HuanShengSong, Ajmal Mian, Mubarak Shah 来源: arXiv:1810.11780v1 项目:http ...
- java+web+下载断点续传
1.先将 webuploader-0.1.5.zip 这个文件下载下来:https://github.com/fex-team/webuploader/releases 根据个人的需求放置自己需要的 ...
- bzoj 3420: Poi2013 Triumphal arch 树形dp+二分
给一颗树,$1$ 号节点已经被染黑,其余是白的,两个人轮流操作,一开始 $B$ 在 $1$ 号节点,$A$ 选择 $k$ 个点染黑,然后 $B$ 走一步,如果 $B$ 能走到 $A$ 没染的节点则 $ ...
- git 切换远程已有分支
本地分支a,且没有分支b,想要切换到远程以后分支b 1. git remote update origin --prune 更新本地分支列表与远程一致 2. git branch 查看本地所有分支,是 ...
- TensorFlow(十六):TensorFlow GPU准备
一:安装cuda 下载地址 二:安装cuDNN 三:安装GPU版TensorFlow 注意:gpu版的TensorFlow打开tensorboard要使用:tensorboard --logdir C ...
- linux经常用的命令
常用 安装包 centos yum / Ubuntu Debian apt-get clear :清空终端 [cmd 下是cls] vi/vim 编辑器 详情 ...
- P2698 [USACO12MAR]花盆Flowerpot——单调队列
记录每天看(抄)题解的日常: https://www.luogu.org/problem/P2698 我们可以把坐标按照x递增的顺序排个序,这样我们就只剩下纵坐标了: 如果横坐标(l,r)区间,纵坐标 ...