一、题目
【问题描述】
早期的电报机只能表达两种状态:电路导通和电路断开。电路导通时喇叭可以发声;断开时则不发声。如何用这样的机器来传递人类能理解的信号呢?聪明的你一定想到了——时间的长短可以表达不同的含义(例如时间长代表 1、时间短代表 0),然后再把 01 的二进制序列对应到字符就可以啦。
摩尔斯电码(Morse code)就是这样一种早期的数字通信协议,它通过喇叭发声长短来表示不同的英文字母:
1、点(半角点号 .),喇叭响 1 单位时间,读作“滴”(dit);
2、划(半角减号 -),喇叭响 3 单位时间,读作“嗒”(dah);
3、字符/单词间的停顿,字符停顿 3 单位时间,单词停顿 7 单位时间。
下图,列出了摩尔斯电码和常见字符之间的对应:
".-", # A
"-...", # B
"-.-.", # C
"-..", # D
".", # E
"..-.", # F
"--.", # G
"....", # H
"..", # I
".---", # J
"-.-", # K
".-..", # L
"--", # M
"-.", # N
"---", # O
".--.", # P
"--.-", # Q
".-.", # R
"...", # S
"-", # T
"..-", # U
"...-", # V
".--", # W
"-..-", # X
"-.--", # Y
"--..", # Z
".----", # 1
"..---", # 2
"...--", # 3
"....-", # 4
".....", # 5
"-....", # 6
"--...", # 7
"---..", # 8
"----.", # 9
"-----", # 0
"..--..", # ?
"-..-.", # /
"-.--.-", # ()
"-....-" # -
二、思路一
群众:我懂得的不多怎么办
作者:没事判断会吧,这个思路主打一个
“打表”
#include<bits/stdc++.h>
using namespace std;
int main()
{
freopen("morse.in","r",stdin);//等级考试中必写(测试代码时标记一下)
freopen("morse.out","w",stdout);//等级考试中必写(测试代码时标记一下)
int n,i,flag;
cin>>n;
while(n--)
{
char a[100000]={0};
scanf("%s", a);
if(a[0]=='.'&&a[1]=='-'&&a[2]!='.'&&a[2]!='-'&&a[3]!='.'&&a[3]!='-'&&a[4]!='.'&&a[4]!='-'&&a[5]!='.'&&a[5]!='-'&&a[6]!='.'&&a[6]!='-')
{
cout<<"A";
}
if(a[0]=='-'&&a[1]=='.'&&a[2]=='.'&&a[3]=='.'&&a[4]!='.'&&a[4]!='-'&&a[5]!='.'&&a[5]!='-'&&a[6]!='.'&&a[6]!='-')
{
cout<<"B";
}
if(a[0]=='-'&&a[1]=='.'&&a[2]=='-'&&a[3]=='.'&&a[4]!='.'&&a[4]!='-'&&a[5]!='.'&&a[5]!='-'&&a[6]!='.'&&a[6]!='-')
{
cout<<"C";
}
if(a[0]=='-'&&a[1]=='.'&&a[2]=='.'&&a[3]!='.'&&a[3]!='-'&&a[4]!='.'&&a[4]!='-'&&a[5]!='.'&&a[5]!='-'&&a[6]!='.'&&a[6]!='-')
{
cout<<"D";
}
if(a[0]=='.'&&a[1]!='.'&&a[1]!='-'&&a[2]!='.'&&a[2]!='-'&&a[3]!='.'&&a[3]!='-'&&a[4]!='.'&&a[4]!='-'&&a[5]!='.'&&a[5]!='-'&&a[6]!='.'&&a[6]!='-')
{
cout<<"E";
}
if(a[0]=='.'&&a[1]=='.'&&a[2]=='-'&&a[3]=='.'&&a[4]!='.'&&a[4]!='-'&&a[5]!='.'&&a[5]!='-'&&a[6]!='.'&&a[6]!='-')
{
cout<<"F";
}
if(a[0]=='-'&&a[1]=='-'&&a[2]=='.'&&a[3]!='.'&&a[3]!='-'&&a[4]!='.'&&a[4]!='-'&&a[5]!='.'&&a[5]!='-'&&a[6]!='.'&&a[6]!='-')
{
cout<<"G";
}
if(a[0]=='.'&&a[1]=='.'&&a[2]=='.'&&a[3]=='.'&&a[4]!='.'&&a[4]!='-'&&a[5]!='.'&&a[5]!='-'&&a[6]!='.'&&a[6]!='-')
{
cout<<"H";
}
if(a[0]=='.'&&a[1]=='.'&&a[2]!='.'&&a[2]!='-'&&a[3]!='.'&&a[3]!='-'&&a[4]!='.'&&a[4]!='-'&&a[5]!='.'&&a[5]!='-'&&a[6]!='.'&&a[6]!='-')
{
cout<<"I";
}
if(a[0]=='.'&&a[1]=='-'&&a[2]=='-'&&a[3]=='-'&&a[4]!='.'&&a[4]!='-'&&a[5]!='.'&&a[5]!='-'&&a[6]!='.'&&a[6]!='-')
{
cout<<"J";
}
if(a[0]=='-'&&a[1]=='.'&&a[2]=='-'&&a[3]!='.'&&a[3]!='-'&&a[4]!='.'&&a[4]!='-'&&a[5]!='.'&&a[5]!='-'&&a[6]!='.'&&a[6]!='-')
{
cout<<"K";
}
if(a[0]=='.'&&a[1]=='-'&&a[2]=='.'&&a[3]=='.'&&a[4]!='.'&&a[4]!='-'&&a[5]!='.'&&a[5]!='-'&&a[6]!='.'&&a[6]!='-')
{
cout<<"L";
}
if(a[0]=='-'&&a[1]=='-'&&a[2]!='.'&&a[2]!='-'&&a[3]!='.'&&a[3]!='-'&&a[4]!='.'&&a[4]!='-'&&a[5]!='.'&&a[5]!='-'&&a[6]!='.'&&a[6]!='-')
{
cout<<"M";
}
if(a[0]=='-'&&a[1]=='.'&&a[2]!='.'&&a[2]!='-'&&a[3]!='.'&&a[3]!='-'&&a[4]!='.'&&a[4]!='-'&&a[5]!='.'&&a[5]!='-'&&a[6]!='.'&&a[6]!='-')
{
cout<<"N";
}
if(a[0]=='-'&&a[1]=='-'&&a[2]=='-'&&a[3]!='.'&&a[3]!='-'&&a[4]!='.'&&a[4]!='-'&&a[5]!='.'&&a[5]!='-'&&a[6]!='.'&&a[6]!='-')
{
cout<<"O";
}
if(a[0]=='.'&&a[1]=='-'&&a[2]=='-'&&a[3]=='.'&&a[4]!='.'&&a[4]!='-'&&a[5]!='.'&&a[5]!='-'&&a[6]!='.'&&a[6]!='-')
{
cout<<"P";
}
if(a[0]=='-'&&a[1]=='-'&&a[2]=='.'&&a[3]=='-'&&a[4]!='.'&&a[4]!='-'&&a[5]!='.'&&a[5]!='-'&&a[6]!='.'&&a[6]!='-')
{
cout<<"Q";
}
if(a[0]=='.'&&a[1]=='-'&&a[2]=='.'&&a[3]!='.'&&a[3]!='-'&&a[4]!='.'&&a[4]!='-'&&a[5]!='.'&&a[5]!='-'&&a[6]!='.'&&a[6]!='-')
{
cout<<"R";
}
if(a[0]=='.'&&a[1]=='.'&&a[2]=='.'&&a[3]!='.'&&a[3]!='-'&&a[4]!='.'&&a[4]!='-'&&a[5]!='.'&&a[5]!='-'&&a[6]!='.'&&a[6]!='-')
{
cout<<"S";
}
if(a[0]=='-'&&a[1]!='.'&&a[1]!='-'&&a[2]!='.'&&a[2]!='-'&&a[3]!='.'&&a[3]!='-'&&a[4]!='.'&&a[4]!='-'&&a[5]!='.'&&a[5]!='-'&&a[6]!='.'&&a[6]!='-')
{
cout<<"T";
}
if(a[0]=='.'&&a[1]=='.'&&a[2]=='-'&&a[3]!='.'&&a[3]!='-'&&a[4]!='.'&&a[4]!='-'&&a[5]!='.'&&a[5]!='-'&&a[6]!='.'&&a[6]!='-')
{
cout<<"U";
}
if(a[0]=='.'&&a[1]=='.'&&a[2]=='.'&&a[3]=='-'&&a[4]!='.'&&a[4]!='-'&&a[5]!='.'&&a[5]!='-'&&a[6]!='.'&&a[6]!='-')
{
cout<<"V";
}
if(a[0]=='.'&&a[1]=='-'&&a[2]=='-'&&a[3]!='.'&&a[3]!='-'&&a[4]!='.'&&a[4]!='-'&&a[5]!='.'&&a[5]!='-'&&a[6]!='.'&&a[6]!='-')
{
cout<<"W";
}
if(a[0]=='-'&&a[1]=='.'&&a[2]=='.'&&a[3]=='-'&&a[4]!='.'&&a[4]!='-'&&a[5]!='.'&&a[5]!='-'&&a[6]!='.'&&a[6]!='-')
{
cout<<"X";
}
if(a[0]=='-'&&a[1]=='.'&&a[2]=='-'&&a[3]=='-'&&a[4]!='.'&&a[4]!='-'&&a[5]!='.'&&a[5]!='-'&&a[6]!='.'&&a[6]!='-')
{
cout<<"Y";
}
if(a[0]=='-'&&a[1]=='-'&&a[2]=='.'&&a[3]=='.'&&a[4]!='.'&&a[4]!='-'&&a[5]!='.'&&a[5]!='-'&&a[6]!='.'&&a[6]!='-')
{
cout<<"Z";
}
if(a[0]=='.'&&a[1]=='-'&&a[2]=='-'&&a[3]=='-'&&a[4]=='-'&&a[5]!='.'&&a[5]!='-'&&a[6]!='.'&&a[6]!='-')
{
cout<<"1";
}
if(a[0]=='.'&&a[1]=='.'&&a[2]=='-'&&a[3]=='-'&&a[4]=='-'&&a[5]!='.'&&a[5]!='-'&&a[6]!='.'&&a[6]!='-')
{
cout<<"2";
}
if(a[0]=='.'&&a[1]=='.'&&a[2]=='.'&&a[3]=='-'&&a[4]=='-'&&a[5]!='.'&&a[5]!='-'&&a[6]!='.'&&a[6]!='-')
{
cout<<"3";
}
if(a[0]=='.'&&a[1]=='.'&&a[2]=='.'&&a[3]=='.'&&a[4]=='-'&&a[5]!='.'&&a[5]!='-'&&a[6]!='.'&&a[6]!='-')
{
cout<<"4";
}
if(a[0]=='.'&&a[1]=='.'&&a[2]=='.'&&a[3]=='.'&&a[4]=='.'&&a[5]!='.'&&a[5]!='-'&&a[6]!='.'&&a[6]!='-')
{
cout<<"5";
}
if(a[0]=='-'&&a[1]=='.'&&a[2]=='.'&&a[3]=='.'&&a[4]=='.'&&a[5]!='.'&&a[5]!='-'&&a[6]!='.'&&a[6]!='-')
{
cout<<"6";
}
if(a[0]=='-'&&a[1]=='-'&&a[2]=='.'&&a[3]=='.'&&a[4]=='.'&&a[5]!='.'&&a[5]!='-'&&a[6]!='.'&&a[6]!='-')
{
cout<<"7";
}
if(a[0]=='-'&&a[1]=='-'&&a[2]=='-'&&a[3]=='.'&&a[4]=='.'&&a[5]!='.'&&a[5]!='-'&&a[6]!='.'&&a[6]!='-')
{
cout<<"8";
}
if(a[0]=='-'&&a[1]=='-'&&a[2]=='-'&&a[3]=='-'&&a[4]=='.'&&a[5]!='.'&&a[5]!='-'&&a[6]!='.'&&a[6]!='-')
{
cout<<"9";
}
if(a[0]=='-'&&a[1]=='-'&&a[2]=='-'&&a[3]=='-'&&a[4]=='-'&&a[5]!='.'&&a[5]!='-'&&a[6]!='.'&&a[6]!='-')
{
cout<<"0";
}
if(a[0]=='.'&&a[1]=='.'&&a[2]=='-'&&a[3]=='-'&&a[4]=='.'&&a[5]=='.'&&a[6]!='.'&&a[6]!='-')
{
cout<<"?";
}
if(a[0]=='-'&&a[1]=='.'&&a[2]=='.'&&a[3]=='-'&&a[4]=='.'&&a[5]=='.'&&a[6]!='.'&&a[6]!='-')
{
cout<<"/";
}
if(a[0]=='-'&&a[1]=='.'&&a[2]=='-'&&a[3]=='-'&&a[4]=='.'&&a[5]=='-'&&a[6]!='.'&&a[6]!='-')
{
cout<<"()";
}
if(a[0]=='-'&&a[1]=='.'&&a[2]=='.'&&a[3]=='.'&&a[4]=='.'&&a[5]=='-'&&a[6]!='.'&&a[6]!='-')
{
cout<<"-";
}
}
cout<<endl;
system("pause");
return 0;
}
看完上面有些人肯定想问:“你为什么在长度短的摩斯密码后面还要判断这么多呢”
举个例子
输入
.-
输出
EA
为什么呢因为你只判断了点没判断后面啊!
三、思路二
我们可以设如果输入的是“.- -.-”
则我们要输出AC
首先我们先设“.-”为第一行 代表“A” 阿斯卡码值为65
第二行“-...”为第二行 代表“B” 阿斯卡码值为66
第三行“-.-.”为第三行 代表“C” 阿斯卡码值为67
此处省略n字
然后呢咱们可以模了,判断输入的为第一行的摩斯密码则输出A
有判断输入的为第三行的摩斯密码则输出‘A’+2
“这不就对了吗”
“然后”
“上代码”
#include<iostream>
#include<cstring>
using namespace std;
char a[10];
char morse[30][10]={".-",
"-...",
"-.-.",
"-..",
".",
"..-.",
"--.",
"....",
"..",
".---",
"-.-",
".-..",
"--",
"-.",
"---",
".--.",
"--.-",
".-.",
"...",
"-",
"..-",
"...-",
".--",
"-..-",
"-.--",
"--..",
};
int Find()
{
int i,j;
for(i=0;i<26;i++)
{
for(j=0;j<=4;j++)
{
if(morse[i][j]!=a[j])
{
break;
}
}
if(j==5)
{
return i;
}
}
}
int main()
{
freopen("morse.in","r",stdin);
freopen("morse.out","w",stdout);
int n,i,j,k;
char ans;
cin>>n;
for(i=1;i<=n;i++)
{
memset(a,0,sizeof(a));//初始化
cin>>a;
cout<<(char )('A'+Find());//行数加字母转换(强制转换)
}
cout<<endl;
system("pause");
return 0;
}
看到这里如果还有哪里没看懂的话,那就发评论问吧。