[算法]Morse Code(摩斯密码)

Morse Code

MorseCode 也被称作摩斯密码,是一种时通时断的信号代码,通过不同的排列顺序来表达不同的英文字母、数字和标点符号。它发明于 1837 年,是一种早期的数字化通信形式。不同于现代化的数字通讯,摩尔斯电码只使用零和一两种状态的二进制代码,它的代码包括五种:短促的点信号 “・・” 一定时间的长信号 “—”,表示点和划之间的停顿、每个词之间中等的停顿,以及句子之间长的停顿。
现在告诉你 26 个英文字母的密码表:

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: “–…”
有同学会发现,两个不同的单词有可能可以转换成一串相同的 Morse Code。现在你有若干个英文单词,想知道单词转换成后不相同的 Code 有多少个。
输入格式
输入有若干行,每行包含由 小写字母 组成的单词。
总共不超过 100 行,且每个单词长度不超过 12。
输出格式
输出一个数,代表有多少个不同 MorseCode。
样例输入
gin
aba
zr
样例输出
2
提示
“gin” -> “–…-.”
“aba” -> “.–…-”
“zr” -> “–…-.”

以上是该题的全部说明。
解题思路:
其实就是把输入的字符串经过转化之后,得到有多少个不一样的字符串。那么,利用STL的set容器的.size()方法就能很方便地解决这个问题。关于set容器的基本操作:STL的set容器的基础操作(C++)。话不多说附上源代码(解题思路当做注释写在代码里了):

#include<iostream>
#include<stdio.h>
#include<set>
#include<string.h>
using namespace std;
set<string> Set;//声明一个set容器
string pwd[1000];//声明一个字符串数组用来记录每一个字母对应的摩斯密码
void init(){//初始化摩斯密码数组(整个代码里最长的就是初始化了)
pwd['a']=".-";
pwd['b']="-...";
pwd['c']="-.-.";
pwd['d']="-..";
pwd['e']=".";
pwd['f']="..-.";
pwd['g']="--.";
pwd['h']="....";
pwd['i']="..";
pwd['j']=".---";
pwd['k']="-.-";
pwd['l']=".-..";
pwd['m']="--";
pwd['n']="-.";
pwd['o']="---";
pwd['p']=".--.";
pwd['q']="--.-";
pwd['r']=".-.";
pwd['s']="...";
pwd['t']="-";
pwd['u']="..-";
pwd['v']="...-";
pwd['w']=".--";
pwd['x']="-..-";
pwd['y']="-.--";
pwd['z']="--..";
pwd['\n']="";
pwd[' ']="";
}

int main(){
	init();//初始化
	string L;//这个是输入源(也就是初始字符串zr aba之类的)
	while(cin>>L){//因为不知道要输入多少个单词,就采用这种写法,当系统输入完毕后自动跳出while循环
		//输入一个单词就处理一个单词
		string::iterator item = L.begin();//声明一个string类型的迭代器,用于拆分单词的每一个字母
		string l = "";//l是记录这个字符串从字母变成摩斯密码的变量
		for(;item!=L.end();item++){//一个一个字母处理
			char c = *item;//每一个字母
			l += pwd[c];//相对应的摩斯密码进行字符串拼接
		}
		Set.insert(l);//将这个完整的摩斯密码放入set容器中
	}
	cout<<Set.size()<<'\n';//因为set容器的机制是不会存相同的内容
	//也就意味着相同的内容只会保留一个,全部的内容都不一样。
	//这个时候只需要输出它的尺寸就是其对应不同摩斯密码的数量啦!
	return 0;//祝大家新年快乐
}
  • 1
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

芣苢的成长之路

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值