HNUSTOJ-1675 Morse Code(DFS+字典序搜索)

1675: Morse Code

时间限制: 2 Sec  内存限制: 128 MB
提交: 73  解决: 33
[提交][状态][讨论版]

题目描述

 摩尔斯电码(英语:Morse Code)是一种时通时断的信号代码,通过不同的排列顺序来表达不同的英文字母、数字和标点符号。是由美国人萨缪尔·摩尔斯在1836年发明。

                                                                                                    --摘自维基百科
摩尔斯电码的代码有点(.),划(-)以及停顿组成。
常见的字符编码见下表:
 
现在我们有码文,可惜的是字符中间的停顿不见了,例如"-.-.", 可以被译码为"C", "KE","NN", "NTE", "TAE", "TEN", "TETE", 或 "TR". 

 

输入

 仅有一行,由点和划构成的字符串,字符串长度不超过25。

 

 

 

输出

 按字母序输出字符串所有可能的译码,每种情况占一行。

 

 

 

样例输入

--.-.

样例输出

GN
GTE
MAE
MEN
METE
MR
QE
TC
TKE
TNN
TNTE
TTAE
TTEN
TTETE
TTR
#include<iostream>
#include<cstring>
#include<cstdio>
#include<string>
#include<map>
#include<set>
using namespace std;
 
char dic[26][7]={
 ".-", "-...", "-.-.", "-..", ".", "..-.", "--.", "....", "..", ".---",
 "-.-", ".-..", "--", "-.", "---", ".--.", "--.-", ".-.", "...", "-",
 "..-", "...-", ".--", "-..-", "-.--", "--.."
};
 
int len;
char a[25], b[25];
 
bool Strcmp(int cur, char *str){
    int len = strlen(dic[cur]);
    for(int i = 0; i < len; i++)
        if(*(str + i) != dic[cur][i]) return false;
    return true;
 
}
void DFS(int cur, int l){
    if(cur == len) {
        for(int i = 0; i < l; i++) printf("%c", a[i]);
        printf("\n"); return;
    }
    for(int i = 0; i < 26; i++){
        if(Strcmp(i, b + cur)){
            a[l] = 'A' + i;
            DFS(cur + strlen(dic[i]), l + 1);
        }
    }
}
int main(){
    scanf("%s", b);
    len = strlen(b);
    DFS( 0, 0);
}

 

posted @ 2017-08-21 21:06  Pretty9  阅读(181)  评论(0编辑  收藏  举报