📄 1009 enigma.cpp
字号:
#include<iostream>
#include<cstring>
using namespace std;
int M, N;
int T[ 3 ][ 30 ];
struct Rotor
{
int map[ 30 ];
int val;
int front, rear;
void init() { val = 0; front = 0; rear = M - 1; }
int next()
{
if ( -- front < 0 )
front += M;
if ( -- rear < 0 )
rear += M;
if ( ++ val == M )
{
val = 0;
return 1;
}
return 0;
}
};
Rotor rList[ 3 ];
char code[ 1000 ], result[ 1000 ];
void moveNext()
{
if ( rList[ 0 ].next() )
{
if ( rList[ 1 ].next() )
rList[ 2 ].next();
}
}
void enCode( char *code, char *result )
{
int i, j, k, itr;
for ( i = 0; code[ i ] != '\0'; i ++ )
{
int key = code[ i ] - 'A';
for ( j = 2; j >= 0; j -- )
for ( itr = rList[ j ].front, k = 0; k < M; itr = ( ++ itr ) % M, k ++ )
{
int map = k - rList[ j ].map[ itr ];
map %= M;
if ( map < 0 )
map += M;
if ( map == key )
{
key = k;
break;
}
}
result[ i ] = (char)( key + 'a' );
moveNext();
}
result[ i ] = '\0';
}
void readSolve()
{
char temp[ 30 ];
int i, j;
for ( i = 0; i < 3; i ++ )
{
rList[ i ].init();
scanf( "%s", temp );
for ( j = 0; j < M; j ++ )
T[ i ][ j ] = rList[ i ].map[ j ] = j - ( temp[ j ] - 'A' );
}
scanf( "%d", &N );
while ( N -- )
{
scanf( "%s", code );
enCode( code, result );
printf( "%s\n", result );
for ( i = 0; i < 3; i ++ )
{
rList[ i ].init();
for ( j = 0; j < M; j ++ )
rList[ i ].map[ j ] = T[ i ][ j ];
}
}
}
int main()
{
int i = 0;
while ( scanf( "%d", &M ) != EOF && M )
{
if ( i )
putchar( '\n' );
printf( "Enigma %d:\n", ++ i );
readSolve();
}
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -