Morse Code HNUST 1675(字符串全排列 递归解决 数组a[]与流输入的缓慢)

25 篇文章 1 订阅
12 篇文章 0 订阅
 题目描述
 摩尔斯电码(英语:Morse Code)是一种时通时断的信号代码,通过不同的排列顺序来表达不同的英文字母、数字和标点符号。是由美国人萨缪尔·摩尔斯在1836年发明。
                                                                                                    --摘自维基百科
摩尔斯电码的代码有点(.),划(-)以及停顿组成。
常见的字符编码见下表:



现在我们有码文,可惜的是字符中间的停顿不见了,例如"-.-.", 可以被译码为"C", "KE","NN", "NTE", "TAE", "TEN", "TETE", 或 "TR".
 输入
 仅有一行,由点和划构成的字符串,字符串长度不超过25。
输出
 按字母序输出字符串所有可能的译码,每种情况占一行。
样例输入
--.-.
样例输出
GN
GTE
MAE
MEN
METE
MR
QE
TC
TKE
TNN
TNTE
TTAE
TTENT
TETE
TTR 
思路:模拟即可,但是比较巧妙的是利用了指针改变了字符数组,或者使用C++中的数组特性
中间还有个小插曲,就是将输出换行符号用C++中的cout流输出,造成TLE,可见输入输出的可怕
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>

using namespace std;
char m[27][6]=
{
".-","-...","-.-.","-..",
".","..-.","--.","....",
"..",".---","-.-",".-..",
"--","-.","---",".--.",
"--.-",".-.","...","-",
"..-","...-",".--","-..-",
"-.--","--.."
};
char s[30],A[30];
int compare(int num,char L[]) //指针处理数组 int compare(int num,char *L)
{
    int len=strlen(m[num]);
    for(int i=0;i<len;i++)
        if(L[i]!=m[num][i]) // 指针处理数组  :if(*(L+i)!=m[num][i])
        return 0;
    return 1;
}
void q_s(int l,int Set,int len)//全排列过程
{
    if(l==Set)//如果长度达到且满足 则输出
    {
       for(int i=1;i<=len;i++)
            putchar(A[i]);
       printf("\n");
    }
    else
    {
       for(int i=0;i<26;i++)
       {
           if(compare(i,s+Set))  //判断s剩下未判断的字符
           {
               A[len+1]='A'+i;
               q_s(l,Set+strlen(m[i]),len+1); //更新长度 排列寻找下一个
           }
       }
    }
}
int main()
{
    gets(s);
    int len=strlen(s);
    q_s(len,0,0);
    return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值