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



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个简单的C语言程序,可以实现摩尔斯电码的编码和解码: ```c #include <stdio.h> #include <string.h> // 摩尔斯电码表 const char* morse_code[] = { ".-", "-...", "-.-.", "-..", ".", "..-.", "--.", "....", "..", ".---", "-.-", ".-..", "--", "-.", "---", ".--.", "--.-", ".-.", "...", "-", "..-", "...-", ".--", "-..-", "-.--", "--..", "-----", ".----", "..---", "...--", "....-", ".....", "-....", "--...", "---..", "----." }; // 字符串转换为摩尔斯电码 void encode(char* str) { for (int i = 0; i < strlen(str); i++) { if (str[i] >= 'a' && str[i] <= 'z') { printf("%s ", morse_code[str[i] - 'a']); } else if (str[i] >= 'A' && str[i] <= 'Z') { printf("%s ", morse_code[str[i] - 'A']); } else if (str[i] >= '0' && str[i] <= '9') { printf("%s ", morse_code[str[i] - '0' + 26]); } else if (str[i] == ' ') { printf("/ "); } } printf("\n"); } // 摩尔斯电码转换为字符串 void decode(char* str) { char* token = strtok(str, " "); while (token != NULL) { if (strcmp(token, "/") == 0) { printf(" "); } else { for (int i = 0; i < 36; i++) { if (strcmp(token, morse_code[i]) == 0) { if (i < 26) { printf("%c", i + 'a'); } else { printf("%c", i - 26 + '0'); } break; } } } token = strtok(NULL, " "); } printf("\n"); } int main() { char input[100]; printf("请输入要编码的字符串:\n"); fgets(input, sizeof(input), stdin); printf("摩尔斯电码为:\n"); encode(input); printf("请输入要解码的摩尔斯电码:\n"); fgets(input, sizeof(input), stdin); printf("解码后的字符串为:\n"); decode(input); return 0; } ``` 使用方法: 1. 运行程序后,输入要编码的字符串,按回车键确认。 2. 程序会输出字符串的摩尔斯电码。 3. 输入要解码的摩尔斯电码,按回车键确认。 4. 程序会输出解码后的字符串。 注意事项: 1. 输入字符串长度不能超过100个字符。 2. 输入字符串只能包含英文、数字和空格。 3. 摩尔斯电码中,点号(.)用`.`表示,短横线(-)用`-`表示,单词之间用`/`表示。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值