⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 1009 enigma.cpp

📁 这是一道模拟题目
💻 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 + -