蓝桥杯(密码)

这篇博客介绍了一种用于蓝桥杯比赛的密码加密算法,包括数据结构的设置,如加密表和标记数组,以及核心的加密和解密函数。作者通过初始化和填充加密表,处理字符在表中的位置,实现对输入字符串的加密和特定情况下的解密操作。文章还提供了一个完整的C++代码示例来说明整个过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


基本的头文件

#include<iostream>

#include<string.h>

using namespace std;

加密表的数据结构

char map[6][6];

输入的密钥字符串

char String[100]

用来翻译的字符串

char no_string[200];

应该是一个标记数组用来标记相应下表表达的字符在表中是否出现

bool rec[100];

不在表里的字符

char NO;

定义了一个结构体数组用来表示对应字符所在表的行

struct point

{

int x;

int y;

}p[26];

一个准备函数主要是用来准备那张表相关的数据结构

int cal()

{

做初始化工作

memset(rec,true,sizeof(rec));

memset(p,0,sizeof(p));

用来控制循环

int i,j,k,len;

临时存储输入进来的字符

char ch;

第一步很简单就是将字符串构造在这个表里

这里有点特殊的是这里存储了这个字符所对应的的行和列

len=strlen(String);

i=j=k=0;

while(k<len)

{

这里少了个括号

if(j>=5)

i++,j=0;

p[int(String[k]-'a')].x=i;

p[int(String[k]-'a')].y=j;

rec[int(String[k]-'a')]=false;

j++;

k++;

}

同理将其余的字符也填在这里面

ch='a';

while(ch<='z')

{

if(j>=5)

i++,j=0;

if(i==5)

break;

if(rec[int(ch-'a')])

{

p[int(ch-'a')].x=i;

p[int(ch-'a')].y=j;

rec[int(ch-'a')]=false;

j++;

}

ch++;

}

找到表中不存在的字符

for(i=0;i<26;i++)

if(rec[i])

{

NO='a'+i;

break;

}

构造张查询表

for(i=0;i<26;i++)

{

if(!rec[i])

map[p[i].x][p[i].y]=char('a'+i);

//cout<<p[i].x<<' '<<p[i].y<<endl;

//cout<<"NO: "<<NO<<endl;

}

输出查询表

for(i=0;i<5;i++)

{

for(j=0;j<5;j++)

cout<<map[i][j];

cout<<endl;

}

return 0;

}

应该是主要功能函数

int ADD()

{

一些基本的控制循环变量的初始化

int len=strlen(no_string);

int i,j,k;

char swp;

灵界情况

if(len==1||len==0)

return 0;

对奇数个情况的分析

if(len%2==1)

len--;

k=0;

while(k<len)

{

两个字符相同我们不翻译

if(no_string[k]==no_string[k+1])

{

k+=2;

continue;

}

有一个字符不在表中

if(no_string[k]==NO||no_string[k+1]==NO)

{

k+=2;

continue;

}

字符在表中的同一行或者是同一列

if(p[int(no_string[k]-'a')].x==p[int(no_string[k+1]-'a')].x||p[int(no_string[k]-'a')].y==p[int(no_string[k+1]-'a')].y)

{

swp=no_string[k];

no_string[k]=no_string[k+1];

no_string[k+1]=swp;

k+=2;

continue;

}

两个字符均在表里

swp=no_string[k];

no_string[k]=map[p[int(no_string[k]-'a')].x][p[int(no_string[k+1]-'a')].y];

no_string[k+1]=map[p[int(no_string[k+1]-'a')].x][p[int(swp-'a')].y];

k+=2;

}

cout<<no_string<<endl;

return 0;

}

主函数

int main()

{

while(cin>>String>>no_string)

{

cal();

ADD();

}

}

这道题目我们能够借鉴的就是我们一定要找到合适的数据结构

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值