蓝桥杯 摩尔斯电码破译 树上的搜索

来源:互联网 发布:域名管理权变更 编辑:程序博客网 时间:2024/05/01 04:42

摩尔斯电码破译。类似于乔林教材第213页的例6.5,要求输入摩尔斯码,返回英文。请不要使用"zylib.h",只能使用标准库函数。用' * '表示' . ',中间空格用' | '表示,只转化字符表。


首先是读入问题,采用scanf一次将所有输入全部放入一个字符组中。然后搜素保存好的字符,输出对应的字母。

问题是,如何判断字符串与字母的对应关系。

观察题中所给表格,发现只存在“-”和“*”两种符号且一共24种组合。可以考虑使用二叉树保存表格往左为“*”往右为“-”使字母与二叉树的节点相对应。


二叉树编号从一开始由上至下由左至右依次排列,在根据表格在相应位置填入字母,在没有字母的节点使用特殊数字表示(我用1表示没有相应字母)。最后将该二叉树保存,我使用一维数组保存,用数组下标表示结点编号,数组存储字母和特殊字符。

在树中搜索时只需定义变量i=1;当为*时i=i*2;为-时i=i*2+1;为|时输出以当前i值为下标的字母并且将i值重新置1.

#include <stdio.h>#include<string.h>int main(void){char str[100000];char found[33]={"11etianmsurwdkgohvf1l1p1b1cyzq11"};/*保存了整颗树*/int cur,i,a;scanf("%s",str);a=strlen(str);for(cur=0,i=1;cur<a;cur++)   /*遍历完输入的所有字符*/{switch(str[cur])           /*搜索树*/{case 42:i*=2;break;case '-':i=i*2+1;break;case '|':printf("%c",found[i]);i=1;break;default:;}}printf("%c",found[i]);          /*由于最后一组字母没有以|结束,这里用于将其直接输出*/    return 0;}




0 0