您的位置:首页 > 其它

Morse Code HNUST 1675(字符串全排列 递归解决 数组a[]与流输入的缓慢)

2017-12-09 16:48 211 查看
 题目描述

 摩尔斯电码(英语:Morse Code)是一种时通时断的信号代码,通过不同的排列顺序来表达不同的英文字母、数字和标点符号。是由美国人萨缪尔·摩尔斯在1836年发明。

                                                                                                    --摘自维基百科

摩尔斯电码的代码有点(.),划(-)以及停顿组成。

常见的字符编码见下表:



现在我们有码文,可惜的是字符中间的停顿不见了,例如"-.-.", 可以被译码为"C", "KE","NN", "NTE", "TAE", "TEN", "TETE", 或 "TR".
 输入

 仅有一行,由点和划构成的字符串,字符串长度不超过25。
输出

 按字母序输出字符串所有可能的译码,每种情况占一行。
样例输入
--.-.
样例输出
GN
GTE
MAE
MEN
METE
MR
QE
TC
TKE
TNN
TNTE
TTAE
TTENT
TETE
TTR 
思路:模拟即可,但是比较巧妙的是利用了指针改变了字符数组,或者使用C++中的数组特性
中间还有个小插曲,就是将输出换行符号用C++中的cout流输出,造成TLE,可见输入输出的可怕

#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>

using namespace std;
char m[27][6]=
{
".-","-...","-.-.","-..",
".","..-.","--.","....",
"..",".---","-.-",".-..",
"--","-.","---",".--.",
"--.-",".-.","...","-",
"..-","...-",".--","-..-",
"-.--","--.."
};
char s[30],A[30];
int compare(int num,char L[]) //指针处理数组 int compare(int num,char *L)
{
int len=strlen(m[num]);
for(int i=0;i<len;i++)
if(L[i]!=m[num][i]) // 指针处理数组  :if(*(L+i)!=m[num][i])
return 0;
return 1;
}
void q_s(int l,int Set,int len)//全排列过程
{
if(l==Set)//如果长度达到且满足 则输出
{
for(int i=1;i<=len;i++)
putchar(A[i]);
printf("\n");
}
else
{
for(int i=0;i<26;i++)
{
if(compare(i,s+Set))  //判断s剩下未判断的字符
{
A[len+1]='A'+i;
q_s(l,Set+strlen(m[i]),len+1); //更新长度 排列寻找下一个
}
}
}
}
int main()
{
gets(s);
int len=strlen(s);
q_s(len,0,0);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  字符 字符串 递归
相关文章推荐