基本的头文件
#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();
}
}
这道题目我们能够借鉴的就是我们一定要找到合适的数据结构