题目描述:
摩尔斯电码(又译为摩斯密码,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 - Zchar b1[15][10] = {"-----", ".----", "..---", "...--", "....-",
".....", "-....", "--...", "---..", "----."}; //存数字0 - 9int 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;
}