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

来源:互联网 发布:21端口查看 编辑:程序博客网 时间:2024/04/25 08:22

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

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


0 0