1 条题解

  • 0
    @ 2025-5-13 10:17:47

    问题分析

    本题要求实现 M.E. Ohaver 提出的摩尔斯电码加密算法,该算法的核心是通过反转每个字符摩尔斯编码的长度信息来实现加密和解密。解题的关键在于理解算法的三个步骤: 编码:将文本转换为摩尔斯码,同时记录每个字符编码的长度 反转:将记录的长度序列反转 解码:使用反转后的长度序列重新分割摩尔斯码并转换回文本 由于加密和解密的步骤完全相同,因此实现一个函数即可完成双向转换。

    方法思路

    数据结构准备:建立字符到摩尔斯码的映射表,以及摩尔斯码到字符的反向映射表 编码过程:遍历输入文本,将每个字符转换为摩尔斯码,并记录其长度 反转长度:将记录的长度列表反转 解码过程:根据反转后的长度列表,从摩尔斯码中截取对应长度的子串,转换回字符

    代码实现

    #include<cstdio>
    #include<string.h>
    #include<string>
    #include<iostream>
    using namespace std;
    
    char map1[26][10]={".-","-...","-.-.","-..",".","..-.","--.","....","..",  ".---","-.-",".-..","--","-.","---",".--.","--.-",".-.","...","-","..-","...-",  ".--","-..-","-.--","--.."};
    char map2[4][10]={"..--","---.",".-.-","----"};
    
    int finda(char c)
    {
        if     (c=='_')return 0;
        else if(c=='.')return 1;
        else if(c==',')return 2;
        else if(c=='?')return 3;
    }
    char findb(char c[])
    {
        for(int i=0;i<26;i++){if(strcmp(c,map1[i])==0)  return 'A'+i;}
        if     (strcmp(c,"..--")==0)                    return '_';
        else if(strcmp(c,"---.")==0)                    return '.';
        else if(strcmp(c,".-.-")==0)                    return ',';
        else if(strcmp(c,"----")==0)                    return '?';
    }
    
    
    int main()
    {
        int n;cin>>n;
        for(int i=1;i<=n;i++)
        {
            char first[110];scanf("%s",first);
            string temp;int num[110];
            int j=0;
            while(first[j]!='\0')
            {
                if(first[j]>='A'&&first[j]<='Z'){temp=temp+map1[first[j]-'A'];num[j]=strlen(map1[first[j]-'A']);}
                else{temp=temp+map2[finda(first[j])];num[j]=strlen(map2[finda(first[j])]);}
                j++;
            }//输入部分
            int count=0;
            for(int x=j-1;x>=(j/2);x--){int temp2;temp2=num[count];num[count]=num[x];num[x]=temp2;count++;}//交换部分
            count=0;
    
    
            cout<<i<<": ";
            for(int x=0;x<j;x++)
            {
                int a=num[x];char ans,temp3[10];int y;
                for(y=0;y<a;y++){temp3[y]=temp[count];count++;}temp3[a]='\0';
                ans=findb(temp3);
                cout<<ans;
            }
            cout<<endl;//输出部分
        }
        return 0;
    }
    
    
    
    
    • 1

    信息

    ID
    52
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    3
    已通过
    1
    上传者