4-6 UVA 508 Morse Mismatches莫尔斯电码

    这个题呢,整体思路比较好想:开两个结构体,一个存放输入的指令(因为不一定按顺序排吗,所以得现搜索某个指令),另一个结构体存放输入的单词,最后开一个数组存放最后的电码。然后对每一个电码进行搜索,然后按照题目规定的输出方式输出。

    输出方式(题目细节):这个题也是看了好几遍,当完全看懂了之后(使劲查单词),再看课本,发现翻译的真是有点问题,总之输出方式呢,是如果有完美匹配的单词,就输出它本身,如果存在多个完美匹配,但有不相同的,那么输出第一个完美匹配的单词并且加上“!”。如果不能完美匹配,但是在指令后面能加减字符能凑出来的(也就是两个字符串相比,长度小的那个 长度范围内 都一样!就是一个是另一个的子字符串,(自己都说晕了。。)),这种情况,需要输出  添加字符数量最少的 那个单词并且加上 “?”,如果实在无法完美匹配(就是一个不是另一个的子字符串),那么根据原文输出字典序最小的并且加上“?”( display the word from context that matches the longest prefix of morse)!

其实我还是不理解它,最长的前缀,就是字典序最小吗?算了记住他吧!

总之  无法完美匹配的  一定要加“?”,精确匹配的如果没有不一样的,就输出本身,有不一样的输出本身加上“!”。

教训:需要细心读题,养成写变量的好习惯(如果变量名称写的不规范,并且行数非常多,查错误真的太难查了)

#include<stdio.h>
#include<string.h>
#include<math.h>
#include<stdlib.h>
#define MAXN 1000 + 5
int long_pre;
struct codecvt
{
    char alpha[MAXN];
    char code[MAXN];
} code_tab[MAXN];
struct codet
{
    char tex[MAXN];
    int num_cont;
    char code[MAXN];
} code_tex[MAXN];
void store(char tex[],int num_tex,int num_code)
{
    int i,j,len = strlen(tex);
    for (i = 0; i < len; i++)
        for (j = 1; j < num_code; j++)
            if (tex[i] == code_tab[j].alpha[0])
                strcat(code_tex[num_tex].code,code_tab[j].code);
}
void Do(char code[MAXN][MAXN],int num_tex,int c_num,int num_morse_code)
{
    int i,j,cont = 0,is_print = 0,min2 = MAXN,min_index2 = 0;
    int distant = 0,min = MAXN,min_index = 0;
    for (i = 1; i < num_tex; i++)
    {
        if (strcmp(code[c_num],code_tex[i].code) == 0)
        {
            for (j = 1; j < num_tex; j++)
                if(strcmp(code_tex[j].code,code[c_num]) == 0)cont++;
            break;
        }
    }
    if (cont > 1)
    {
        printf("%s!\n",code_tex[i].tex);
        is_print = 1;
    }
    else if (cont == 1)
    {
        printf("%s\n",code_tex[i].tex);
        is_print = 1;
    }
    cont = 0;
    if (is_print)return;
    for (i = 1; i < num_tex; i++)
    {
        int len = strlen(code_tex[i].code) < strlen(code[c_num]) ? strlen(code_tex[i].code) : strlen(code[c_num]);
        for (j = 0; j < len; j++)
            if (code_tex[i].code[j] != code[c_num][j])distant++;
        if (distant == 0)
        {
            int len2 = strlen(code_tex[i].code) - strlen(code[c_num]);
            if (len2 < 0)len2 = -len2;
            if (len2 < min2)
            {
                min2 = len2;
                min_index2 = i;
            }
        }
        if (distant < min)
        {
            min = distant;
            min_index = i;
        }
        distant = 0;
    }
    if (min != 0)printf("%s?\n",code_tex[long_pre].tex);
    else printf("%s?\n",code_tex[min_index2].tex);
}
int main()
{
//    freopen("out.txt","w",stdout);
    int num_code = 1,num_tex = 1,i;
    while(1)
    {
        scanf("%s",code_tab[num_code].alpha);
        if (code_tab[num_code].alpha[0] == '*')break;
        scanf("%s",code_tab[num_code].code);
        num_code++;
    }
    long_pre = 1;
    while(1)
    {
        scanf("%s",code_tex[num_tex].tex);
        if (strcmp(code_tex[num_tex].tex ,"*") == 0)break;
        int len = strlen(code_tex[num_tex].tex);
        if (strcmp(code_tex[long_pre].tex,code_tex[num_tex].tex) > 0)
            long_pre = num_tex;
        code_tex[num_tex].num_cont = 0;
        store(code_tex[num_tex].tex,num_tex,num_code);    //  (array,number);
        num_tex++;
    }
    char code[MAXN][MAXN];
    int num_morse_code = 1;
    while(1)
    {
        scanf("%s",code[num_morse_code]);
        if (code[num_morse_code][0] == '*')break;
        num_morse_code++;
    }
    for (i = 1; i < num_morse_code; i++)
        Do(code,num_tex,i,num_morse_code);
    return 0;
}


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
莫尔斯电码是一种用于发送电报的编码方式,它将字母、数字和标点符号转化为不同长度的短、长信号,以便通过电报机传输。Matlab中可以使用以下代码实现莫尔斯电码的编码和解码: ```matlab % 莫尔斯电码编码表 morseCode = struct('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', '----.', ... '.', '.-.-.-', ',', '--..--', '?', '..--..', ';', '-.-.-.', ... ':', '---...', '/', '-..-.', '-', '-....-', '(', '-.--.', ... ')', '-.--.-', '_', '..--.-', '"', '.-..-.', '$', '...-..-', ... '@', '.--.-.', '!', '-.-.--'); % 莫尔斯电码编码函数 function morse = encodeMorse(str) morse = ''; for i = 1:length(str) if isfield(morseCode, upper(str(i))) morse = [morse, morseCode.(upper(str(i))), ' ']; else morse = [morse, ' ']; end end end % 莫尔斯电码解码函数 function str = decodeMorse(morse) str = ''; codes = strsplit(morse, ' '); for i = 1:length(codes) if ~isempty(codes{i}) letters = fieldnames(morseCode); for j = 1:length(letters) if strcmpi(morseCode.(letters{j}), codes{i}) str = [str, lower(letters{j})]; break; end end else str = [str, ' ']; end end end ``` 使用示例: ```matlab >> encodeMorse('SOS') ans = ... --- ... >> decodeMorse('... --- ...') ans = sos ```
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值