ZOJ1009 Enigma

<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--> #include < iostream >
#include
< string >
using namespace std;

int rotor[ 3 ][ 26 ]; // 密码表
int rround[ 3 ]; // 加权轮转表
int totalLetter;

void nextStep()
{
// 密码表轮转
rround[ 0 ] ++ ;
if (rround[ 0 ] % totalLetter == 0 )
{
rround[
1 ] ++ ;
rround[
0 ] = 0 ;
if (rround[ 1 ] % totalLetter == 0 )
{
rround[
2 ] ++ ;
rround[
2 ] %= totalLetter;
rround[
1 ] = 0 ;
}
}
}

void revolve( char ch)
{
// 利用密码表解密
int num,i;
num
= ch - ' A ' ;
for (i = 2 ;i >= 0 ;i -- )
{
num
+= rotor[i][(num - rround[i] + totalLetter) % totalLetter];
num
= (num + totalLetter) % totalLetter;
}
cout
<< ( char )( ' a ' + num);
}

int main()
{
string curLine;
int i,j,nCase;
int numCrypt;
nCase
= 1 ;
while (cin >> totalLetter && totalLetter != 0 )
{
memset(rotor,
0 , sizeof (rotor)); // 密码表清零
// 初始化密码表
for (i = 0 ;i < 3 ;i ++ )
{
cin
>> curLine;
for (j = 0 ;j < totalLetter; ++ j)
{
rotor[i][curLine[j]
- ' A ' ] = j - (curLine[j] - ' A ' );
}
}
if (nCase != 1 )
cout
<< endl;
cin
>> numCrypt;
cout
<< " Enigma " << nCase ++<< " : " << endl;
for (i = 0 ;i < numCrypt;i ++ )
{
memset(rround,
0 , sizeof (rround)); // 加权轮转表清零
j = 0 ;
cin
>> curLine; // 输入密文
while (curLine[j] != ' /0 ' )
{
revolve(curLine[j
++ ]); // 解密
nextStep(); // 密码表轮转
}
cout
<< endl;
}
}
return 0 ;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值