且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

ZOJ1009 Enigma

更新时间:2022-09-05 09:56:26

#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; 
}

复制代码



本文转自Phinecos(洞庭散人)博客园博客,原文链接:http://www.cnblogs.com/phinecos/archive/2008/10/24/1318748.html,如需转载请自行联系原作者