题目描述:
摩尔斯电码(又译为摩斯密码,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; }