算法習題---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 --..
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);
}
相關文章
相關標籤/搜索