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);
}