3074. 特殊加密

单点时限: 2.0 sec

内存限制: 256 MB

为了加密英文字符串,设计了一种特殊的加密方法,加密规则如下:

1、每一个英文字母转换为两个数字 a1,a2,表示该英文字母在传统手机键盘上的数字键 a1 上的第 a2 个字母。

例如,字母 G; 转换为 41;,即,字母 G; 为手机键盘上的数字键 4; 上的第 1 个字母;

字母 Z; 转换为 94;,即,字母 Z; 为手机键盘上的数字键 9; 上的第 4 个字母。

2、经过步骤 1 的转换,得到一个数字序列 a1,a2,a3,a4,a5,a6,⋯,an−1,an,(1≤ai≤9,1≤i≤n,n为偶数),再将该数字序列用莫尔斯密码加密得到电文。

例如:

字母序列为:GZGTGOGXNCS

加密过程:

1、字母转换:G(41),Z(94),G(41),T(81),G(41),O(63),G(41),X(92),N(62),C(23),S(74)

2、得到数字序列为:4194418141634192622374;,将该数字序列用莫尔斯密码加密得到如下电文:

…-/.----/----./…-/…-/.----/—…/.----/…-/.----/-…/…–/…-/.----/----./…—/-…/…—/…—/…–/--…/…-

输入格式
第 1 行:一个整数 T (1≤T≤10) 为问题数。

接下来 T 行,每行输入一个字符串,字符串长度不超过 200 个字符,字符串只包含大写英文字母,不含空格。

输出格式
对于每个问题,输出一行问题的编号(0 开始编号,格式:case #0: 等)。然后对应每个问题在一行中输出加密后的莫尔斯电文。

说明:在输出时,点信号用字符 .(小数点)表示,长信号用字符 -(减号)表示,数字的莫尔斯电码之间用一个字符 / 分隔。

样例
input
3
THISISASAMPLE
ILOVEYOU
ECNUCS
output
case #0:
—…/.----/…-/…—/…-/…–/--…/…-/…-/…–/--…/…-/…—/.----/–…/…-/…—/.----/-…/.----/–…/.----/…/…–/…–/…—
case #1:
…-/…–/…/…–/-…/…–/—…/…–/…–/…—/----./…–/-…/…–/—…/…—
case #2:
…–/…—/…—/…–/-…/…—/---…/…—/…—/…–/--…/…-

/*
简单模拟
*/
#include<iostream>
#include<algorithm>
using namespace std;
void print(int n) {
	string s;
	int m=n;
	if(n>5)
		n=10-n;
	for(int i =0 ; i < n; i++)
		s+=".";
	for(int i=n; i<5; i++)
		s+="-";
	if(m>5)
		reverse(s.begin(),s.end());
	cout<<s;
}
int main() {
//	print(0);
	int t;
	cin>>t;
	int count=0;
	int flag[27];
	int index=1;
	for(int i = 2; i <= 9; i++) {
		int j =3;
		if(i==7||i==9)
			j++;
		for(int k=1; k<=j; k++) {
			flag[index++]=i*10+k;
			//cout<<flag[index-1]<<" ";
		}

	}
	while(t--) {
		string s;
		cin>>s;
		printf("case #%d:\n",count++);
		for(int i = 0; i < s.size(); i++) {
			int m=flag[s[i]-'A'+1];
			int x=m/10;
			int y=m%10;
			print(x);
			cout<<"/";
			print(y);
			if(i<s.size()-1)
			cout<<"/";
		}
		cout<<endl;
	}
	return 0;
}
发布了45 篇原创文章 · 获赞 21 · 访问量 486

猜你喜欢

转载自blog.csdn.net/qq_40394960/article/details/105120745
今日推荐