ZOJ1009 Enigma

简介:
#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,如需转载请自行联系原作者
目录
相关文章
|
人工智能 Go
ZOJ 3635 Cinema in Akiba
题意:一群人到电影院看电影,该电影的门票计算比较特殊,如:甲第一个拿到1号门票则位置为1,乙第二个拿票,票号也是1,则位置为2,因为1号位置已经被甲占了,乙的位置为剩下位置中的1号位置。
122 0
|
人工智能 BI 应用服务中间件
|
机器学习/深度学习
|
Java 测试技术 C++
HDU 3783 ZOJ
ZOJ Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 2779    Accepted Submission(s): 1840 Problem Description 读入一个字符串,字符串中包含ZOJ三个字符,个数不一定相等,按ZOJ的顺序输出,当某个字符用完时,剩下的仍然按照ZOJ的顺序输出。
1111 0

热门文章

最新文章