C++-螺旋加密问题

描述

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<bits/stdc++.h> 
using namespace std;
int m[25][25];
bool m1[25][25];
char l[405];
int row,col,y,len,ans = 0;
void change(int n,int p){
	int s = p-4;
	while(p>=s){
		l[p] = n%2+0x30;
		n/=2;
		p--;
	}
}
bool pd(int x,int y){
	if(m1[x-1][y]&&m1[x][y-1]&&m1[x+1][y]&&m1[x][y+1]&&x-1>=0&&x+1<row&&y-1>=0&&y+1<col){
		return true;
	}else{
		return false;
	}
} 
void fill(){
	int x = 0,y = 0;
	len*=5;
	while(ans!=len){
		if(pd(x,y)){
			m[x][y] = l[ans]-0x30;
			break;
		}
		while(!m1[x][y+1]&&y+1<col){
			m[x][y] = l[ans]-0x30;
			ans++;
			m1[x][y] = true;
			y++;
			if(ans == len){
				break;
			}
		}
		if(ans == len){
			break;
		}
		while(!m1[x+1][y]&&x+1<row){
			m[x][y] = l[ans]-0x30;
			ans++;
			m1[x][y] = true;
			x++;
			if(ans == len){
				break;
			}
		}
		if(ans == len){
			break;
		}
		while(!m1[x][y-1]&&y>0){
			m[x][y] = l[ans]-0x30;
			ans++;
			m1[x][y] = true;
			y--;
			if(ans == len){
				break;
			}
		}
		if(ans == len){
			break;
		}
		while(!m1[x-1][y]&&x>0){
			m[x][y] = l[ans]-0x30;
			ans++;
			m1[x][y] = true;
			x--;
			if(ans == len){
				break;
			}
		}
		if(ans == len){
			break;
		}
	}
}
int main(){
	int k[400] = {0};
	cin>>row>>col;
	while(1){
		char a = getchar();
		if(a == '\n'){
			break;
		}else{
			if(a == ' '){
				if(len == 0){
					continue;
				}
				k[len] = 0; 
			}else{
				k[len] = a-'A'+1;
			}
			len++;
		}
	}
	int p = 4;
	for(int i = 0;i<len;i++){
		change(k[i],p);
		p+=5;
	}
	fill();
	for(int i = 0;i<row;i++){
		for(int j = 0;j<col;j++){
			cout<<m[i][j];
		}
	}
	return 0;
}

代码巨长巨坑,点个关注吧!!谢谢!!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值