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
}

你可能感兴趣的:(ZOJ)