这个题呢,整体思路比较好想:开两个结构体,一个存放输入的指令(因为不一定按顺序排吗,所以得现搜索某个指令),另一个结构体存放输入的单词,最后开一个数组存放最后的电码。然后对每一个电码进行搜索,然后按照题目规定的输出方式输出。
输出方式(题目细节):这个题也是看了好几遍,当完全看懂了之后(使劲查单词),再看课本,发现翻译的真是有点问题,总之输出方式呢,是如果有完美匹配的单词,就输出它本身,如果存在多个完美匹配,但有不相同的,那么输出第一个完美匹配的单词并且加上“!”。如果不能完美匹配,但是在指令后面能加减字符能凑出来的(也就是两个字符串相比,长度小的那个 长度范围内 都一样!就是一个是另一个的子字符串,(自己都说晕了。。)),这种情况,需要输出 添加字符数量最少的 那个单词并且加上 “?”,如果实在无法完美匹配(就是一个不是另一个的子字符串),那么根据原文输出字典序最小的并且加上“?”( 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;
}