ECNU 3061 莫尔斯电码
ECNU 3061 莫尔斯电码
链接
https://acm.ecnu.edu.cn/problem/3061
题目
单点时限: 2.0 sec
内存限制: 256 MB
摩尔斯电码(Morse code)是美国人艾尔菲德 . 维尔于 1837 年发明的一种时通时断的信号代码。摩尔斯电码由两种基本信号和不同的间隔时间组成。
两种基本信号为:短促的点信号.,读滴(Di);保持一定时间的长信号-,读嗒(Da),这两种基本信号通过不同的排列顺序表示不同的英文字母、数字和标点符号。例如:国际通用求救信号SOS,它的莫尔斯电码为...---...(三点,三长,三点,即:滴滴滴,嗒嗒嗒,滴滴滴)。
下面两张表为英文字母和数字的标准莫尔斯电码对照表。
在摩尔斯电码中,字母 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
思路
思路不是很复杂,只需要把匹配的符号改为数字或字母即可,问题是.和空格的处理,五个/代表.,三个/代表空格,所以我先把这两个给置换成/1/和/2/,之后对于/分割,只需要处理12即可,转换输出即可。
这里对于字符串改变,用了数组change,匹配的话,下一位就是正确的解,+1即可。
代码
public static String[] change = new String[]{
".-", "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",
"-----", "0",
".----", "1",
"..---", "2",
"...--", "3",
"....-", "4",
".....", "5",
"-....", "6",
"--...", "7",
"---..", "8",
"----.", "9",
"1", ".",
"2", " "
};
public static void fun() {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
for (int i = 0; i < n; i++) {
System.out.println("case #" + i + ":");
String line = sc.next();
line = line.replace("/////","/1/");
line = line.replace("///","/2/");
String[] str = line.split("/");
for (int j = 0; j < str.length; j++) {
for (int t = 0; t < change.length; t = t + 2) {
if (str[j].equals(change[t])) {
System.out.print(change[t + 1]);
break;
}
}
}
System.out.println();
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)