67:螺旋加密

描述

Chip和Dale发明了一种文本信息加密技术。他们事先秘密约定好矩阵的行数和列数。接着,将字符按如下方式编码:

1. 所有文本只包含大写字母和空格。

2. 每个字符均赋予一个数值:空格=0,A=1,B=2,……,Y=25,Z=26。

按照下图所示的方式,将每个字符对应数值的5位二进制数依次填入矩阵。最后用0将矩阵补充完整。例如,对于信息“ACM”,行列数均为4时,矩阵将被填充为:

将矩阵中的数字按行连起来形成数字串,完成加密。例子中的信息最终会被加密为:0000110100101100。

输入

一行。首先是两个整数R(1≤R≤20)和C(1≤C≤20),表示行数和列数。之后是一个只包含大写字母和空格的字符串。字符串的长度≤(R*C)/5。R和C之间以及C和字符串之间均用单个空格隔开。

输出

一行,为加密后的二进制串。注意你可能需要用0将矩阵补充完整。

样例输入

4 4 ACM

样例输出

0000110100101100

来源

Greater NY 2007

主程序:

#include <bits/stdc++.h>
using namespace std;
int A[20][20];
string Lib[26]={"00001", "00010", "00011", "00100", "00101", "00110", "00111", "01000", "01001", "01010","01011", "01100", "01101", "01110", "01111", "10000", "10001", "10010", "10011", "10100", "10101", "10110", "10111", "11000", "11001", "11010"},s1, s2;
int main(){
	int n, m;
	cin >> n >> m;
	getline(cin, s1);
	for (int i = 1; i < s1.length(); i++)
	{
		if (s1[i] == ' ')
		{
			s2 += "00000";
		}
		else
		{
			s2 += Lib[s1[i] - 'A'];
		}
	}
	int t = 0,len = s2.length(),left = -1,right = m - 1,top = 0,bottom = n - 1;
	while (t < len)
	{
		if (top <= bottom)
		{
			for (int j = ++left; t < len && j <= right; j++) 
			{
				A[top][j] = s2[t++] - '0';
			}
		}
		if (left <= right)
		{
			for (int i = ++top; t < len && i <= bottom; i++)
			{
				A[i][right] = s2[t++] - '0';
			}
		}
		if (top <= bottom)
		{
			for (int j = --right; t < len && j >= left; j--)
			{
				A[bottom][j] = s2[t++] - '0';
			}
		}
		if (left <= right)
		{
			for (int i = --bottom; t < len && i >= top; i--)
			{
				A[i][left] = s2[t++] - '0';
			}
		}
	}
	for (int i = 0; i < n; i++)
	{
		for (int j = 0; j < m; j++)
		{
			cout << A[i][j];
		}
	}
	cout << endl;
	return 0;
}
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值