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

本文介绍了一种使用二叉树结构实现的摩尔斯电码解码算法,通过将摩尔斯电码转换为ASCII字符,实现了从摩尔斯电码到英文的自动转换。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

摩尔斯电码破译。类似于乔林教材第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;
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值