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 ----.
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 --..
0 ------
1 .-----
2 ..---
3 ...--
4 ....-
5 .....
6 -....
7 --...
8 ---..
9 ----.
* //表明结束此类输入
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[0]!='*')
{
Morse = "",i=0;
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 = 0;
for (i = 0; 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[0] != '*')
{
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 = 80;
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);
}