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
}

复制代码

posted on   Phinecos(洞庭散人)  阅读(696)  评论(1编辑  收藏  举报

编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· [AI/GPT/综述] AI Agent的设计模式综述
历史上的今天:
2006-10-24 WebCast听课录(7)

导航

统计

点击右上角即可分享
微信分享提示