您的位置:首页 > 其它

ZOJ1009 Enigma

2008-10-24 14:45 267 查看
#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;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: