题目描述:
摩尔斯电码(又译为摩斯密码,Morse code)是一种时通时断的信号代码,通过不同的排列顺序来表达不同的英文字母、数字和标点符号。为了简单问题,去除所有的标点符号。
现在给你一段摩斯密码,请你把它们进行解密。
输入
含有T(T<=20)组数据,每组数据包含一段摩斯密码(由字符 '.' 和 '-' 以及 空格组成,连续空格个数不超过两个),每段占一行(不超过1000个字符),现在请你对他们进行解密;
输出
输出对应的解密后的结果(所有解密结果如果是英文字母一律输出小写英文字母),保证结果仅包含 数字 空格 字母。
样例输入
5 .. . . . .. . .. .. .-.. --- ...- . -.-- --- ..-
样例输出
i ee ei e i i love you
解题思路:
就是一个模拟题, 考虑好空格的个数,然后将字母和数字代表的摩斯密码存到一个二维数组里
代码:
# include <stdio.h>
# include <string.h>
char a[1001];
int c;
char b[30][10] = {".-", "-...", "-.-.", "-..", ".", "..-.",
"--.", "....", "..", ".---", "-.-", ".-..", "--", "-.", "---",
".--.", "--.-", ".-.", "...", "-", "..-", "...-", ".--", "-..-",
"-.--", "--.."}; // 存字符A - Z
char b1[15][10] = {"-----", ".----", "..---", "...--", "....-",
".....", "-....", "--...", "---..", "----."}; //存数字0 - 9
int main(void)
{
int t, d, i, j, q, k;
char a1[10]; // 存要比较的字符串
scanf("%d", &t);
getchar();
while (t --)
{
memset(a1, 0, sizeof(a1)); //每次的初始化
gets(a);
d = strlen(a);
c = 0;
for (i = 0; i < d; i ++)
{
if (a[i] != ' ')
{
a1[c ++] = a[i];
}
else
{
if (c == 5) //数字的密码都是5位的。
{
for (j = 0; j <= 10; j ++)
{
if (strcmp(a1, b1[j]) == 0)
{
q = j;
break;
}
}
printf("%d", q);
if (a[i+1] == ' ') //判断后一位是不是‘ ’, 如果是要输出一个空格
{
printf(" ");
i = i+1;
}
}
else // 判断字符
{
for (j = 0; j <= 26; j ++)
{
if (strcmp(a1, b[j]) == 0)
{
q = j;
break;
}
}
printf("%c", q+97); // 转化为小写的
if (a[i+1] == ' ')
{
printf(" ");
i = i+1;
}
}
c = 0;
memset(a1, 0, sizeof(a1));
}
}
if (c == 5) //判断最后一个 和for循环里面的是一样的、
{
for (i = 0; i <= 10; i ++)
{
if (strcmp(a1, b1[i]) == 0)
{
q = i;
break;
}
}
printf("%d", q);
}
else
{
for (i = 0; i <= 26; i ++)
{
if (strcmp(a1, b[i]) == 0)
{
q = i;
break;
}
}
printf("%c", q+97);
}
printf("\n");
}
return 0;
}