二维数组练习25_螺旋加密

/*
	Name: 25_螺旋加密
	Copyright: 
	Author: 
	Date: 31-08-17 14:37
	Description: 25_螺旋加密
查看 提交 统计 提问
总时间限制: 1000ms 内存限制: 65536kB
描述
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
*/
#include <iostream>
#include <string>

using namespace std;

const int M = 20;
const int N = 20;
char A[N][M];
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"};
string 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'];
	} 
	for (int i=n*m-s2.length(); i>0; i--)//补足多余的0 
		s2 += "0";
	
	int t=0,left=-1,right=m-1,top=0,bottom=n-1;//分别代表左右上下边界 
	while (left<=right && top<=bottom)
	{
		if (top<=bottom)
		{
			for (int j=++left; j<=right; j++)//向右 
				A[top][j] = s2[t++];
		}
		if (left<=right)
		{
			for (int i=++top; i<=bottom; i++)//向下 
				A[i][right] = s2[t++];
		}
		if (top<=bottom)
		{
			for (int j=--right; j>=left; j--)//向左
				A[bottom][j] = s2[t++];
		}
		if (left<=right)
		{
			for (int i=--bottom; i>=top; i--)//向上 
				A[i][left] = s2[t++];
		}
	}
	
	for (int i=0; i<n; i++)
	{
		for (int j=0; j<m; j++)
		{
			cout << A[i][j];
		}
	}
	cout << endl;
	
	return 0;	
} 
#include <iostream>
#include <string>
#include <cstdio>

using namespace std;

const int M = 20;
const int N = 20;
int A[N][M];
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"};
string 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;	
} 




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值