「EOJ」3061 摩尔斯电码

题目

摩尔斯电码(Morse code)是美国人艾尔菲德 . 维尔于 1837 年发明的一种时通时断的信号代码。摩尔斯电码由两种基本信号和不同的间隔时间组成。

两种基本信号为:短促的点信号.,读(Di);保持一定时间的长信号-,读(Da),这两种基本信号通过不同的排列顺序表示不同的英文字母、数字和标点符号。例如:国际通用求救信号SOS,它的莫尔斯电码为...---...(三点,三长,三点,即:滴滴滴,嗒嗒嗒,滴滴滴)。

下面两张表为英文字母和数字的标准莫尔斯电码对照表。

img

在摩尔斯电码中,字母 M; 表示为--(电报中为嗒嗒),字母 E; 表示为.(电报中为),字母 G; 表示为--.(电报中为嗒嗒滴),因此如果连续发送--.嗒嗒滴),收报方会误以为是字母 G; 而不是ME

那么,为了表示ME,需要在两个字母之间加入间隔,例如,--/.嗒嗒 / 滴),/可以用时间上的停顿来表示。

因此,摩尔斯电码除了信号和信号,还有不同的间隔时间,根据间隔时间长短,可细分为 : 字符间短的间隔时间、单词之间中等长的间隔时间以及句子之间比较长的间隔时间 。

请编写一个程序,模拟莫尔斯电码的翻译,输入一串莫尔斯电码,输出其对应的明文信息。

假设在莫尔斯电码中,点信号用字符 .;(小数点)表示,长信号用字符 -;(减号)表示, 字符间短的间隔时间用一个字符 /; 表示,单词之间中等长的间隔时间用三个字符 /; 表示,句子之间比较长的间隔时间用五个字符 /; 表示。

例如:

莫尔斯电码:

-/..../../...///../...///--/---/.-./..././//-.-./---/-.././-.../-.--/.

翻译出来的明文信息为:THIS IS MORSE CODE.BYE

说明:在输出时,单词之间用一个空格符分隔,句子之间用字符 . 分隔。所有字符均为大写字母。

输入格式

第 1 行:一个整数 T(1≤T≤10)为问题数。

接下来 T 行,每行输入一串莫尔斯电码,电码长度不超过 1000 个字符,电码由.-/三种字符构成。

/表示输入的空格。

输出格式

对于每个问题,输出一行问题的编号(0 开始编号,格式:case #0: 等)。然后对应每个问题在一行中输出莫尔斯电码表示的明文信息。

说明:在输出时,单词之间用一个空格符分隔,句子之间用字符. 分隔。英文字母均为大写字母。

样例

input

3
.../---/...
-/..../../...///../...///--/---/.-./..././//-.-./---/-.././-.../-.--/.
-./---///.----/..---/-----

output

case #0:
SOS
case #1:
THIS IS MORSE CODE.BYE
case #2:
NO 120

答案(过于无聊)

void solve()
{   char *moose[36]={".-","-...","-.-.","-..",".","..-.","--.","....","..",".---","-.-",".-..","--","-.","---",".--.","--.-",".-.","...","-","..-","...-",".--","-..-","-.--","--..","-----",".----","..---","...--","....-",".....","-....","--...","---..","----."};
    char str[1001],code[6],text[501];
    int i=0,j,k;  char ch;  int flag,n=0;
    gets(str);
    while(str[i])
    {   j=0;
        while(str[i]=='.'||str[i]=='-') code[j++]=str[i++];     code[j]='\0';
        for(k=0; k<36; k++)
            if(strcmp(code,moose[k])==0)
            {   if(k<26) ch=k+65;  else ch=k+22;
                text[n++]=ch;  break; }
        if(k>=36) {printf("Data Error!\n");return;}
        flag=0;
        while(str[i]=='/') {flag++;i++;}
        if(flag==3) text[n++]=' ';  else if(flag==5) text[n++]='.';
    }
    text[n]='\0';  printf("%s\n",text);
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值