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
- 4-6 UVA 508 Morse Mismatches莫尔斯电码
- UVa 508 Morse Mismatches(莫尔斯电码)
- 算法竞赛入门经典(第2版)习题4-6 莫尔斯电码 Morse Mismatches UVa 508
- uva508 莫尔斯电码(Morse Mismatches)
- UVA 508 Morse Mismatches
- UVa 508 - Morse Mismatches
- UVA 508 Morse Mismatches
- UVA 508 Morse Mismatches
- 习题4-6 莫尔斯电码 UVa508
- UVa 508 - Morse Mismatches(查找)
- UVA - 508 Morse Mismatches(STL)
- UVA-508 Morse Mismatches(STL模拟)
- 508 - Morse Mismatches
- 508 - Morse Mismatches
- 莫尔斯电码
- 莫尔斯电码
- UVA 508 莫尔斯电码,map的妙用,函数的组合
- 莫尔斯电码的趣事
- android观察者模式:EventBus实现GPS定位
- Maven使用
- CUDA入门(9):固定内存和零拷贝内存
- 学习MarkDown流程图写法
- Android使用bit.ly的api获取url 短连接
- 4-6 UVA 508 Morse Mismatches莫尔斯电码
- Push推送
- 面向GC的Java编程
- TextView下划线带颜色
- js 去除数组的重复
- 僵尸进程zombie与孤儿进程orphan
- nginx之proxy_pass的session丢失
- python混合笔记(一)
- CF 335 div.2-A/606A Magic Spheres(读错题意系列)