NOI1.8.25 螺旋加密 题解(C++)

NOI1.8.25 螺旋加密 题解(C++)

这题太坑了吧,给大家看一下我的提交记录:
NOI1.8.25 螺旋加密 题解(C++)_第1张图片
这是我两个月前刷的这一题。写第7次的时候才对啊。。。
NOI1.8.25 螺旋加密 题解(C++)_第2张图片
直接上题目吧:

题目

总Time Limit: 1000ms Memory Limit: 65536kB
Description
Chip和Dale发明了一种文本信息加密技术。他们事先秘密约定好矩阵的行数和列数。接着,将字符按如下方式编码:
1 . 所有文本只包含大写字母和空格。
2 . 每个字符均赋予一个数值:空格=0,A=1,B=2,……,Y=25,Z=26。
按照下图所示的方式,将每个字符对应数值的5位二进制数依次填入矩阵。最后用0将矩阵补充完整。例如,对于信息“ACM”,行列数均为4时,矩阵将被填充为:
NOI1.8.25 螺旋加密 题解(C++)_第3张图片
将矩阵中的数字按行连起来形成数字串,完成加密。例子中的信息最终会被加密为:0000110100101100。

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

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

Sample Input
4 4 ACM
Sample Output
0000110100101100

思路

作者很弱,但是这题真的能模拟,真的能模拟。。。只不过很麻烦就是了。

带注释AC代码:

#include 
using namespace std;
int m[25][25];//根据题意,也用二维数组模拟
bool m1[25][25];//m1用来标注这个格子是否走过
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;//把二进制填充5位到l,记住l是字符数组 
		n/=2;
		p--;
	}
}//10进制转2进制 
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;//len个字符,转数字后换成2进制数(5位),所以要乘以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){//+1
			break;
		}
	}
}//螺旋填充m这个二维数组 
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;
}

在这里插入图片描述

你可能感兴趣的:(题解,信息学)