/********************************************************************************************
1、摁过按键后,转盘转一格,当第一个转盘转动m格(即一圈),第二个转盘转一格,后面类推
2、原题中加密流程是这样的(一个转盘为例):
(1)摁下b,显示A,转盘转一格
(2)再摁b显示什么呢?这就要看b的上一个(即a)和谁连通,即B,然后B的下一格是C,即显示C
3、原题是求解密,即加密的逆过程(一个转盘为例):
(1)第一个显示字母为A(此时转盘还未转动),故原文为b
(2)第二个显示字母为C(此时转盘已转一格),C上一格为B,B又和a连通,a的下一格是b,即原文是b
(3)第三个显示字母为E(此时转盘已转二格),E上两格为C,C又和f连通,f的下两格是b,即原文是b
**********************************************************************************************/
#include
#include
char alph[] = {'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'};
int main()
{
int i, j, k, m, n, len, cas = 0;
int r[3];//存放三个转盘的转动次数
char ini[3][33], cr[999], res[999], temp;
while(scanf("%d", &m), m)
{
if(cas++)
printf("\n");
printf("Enigma %d:\n", cas);
for(i = 0; i < 3; i++)
scanf("%s", ini[i]);
scanf("%d", &n);
while(n--)
{
scanf("%s", cr);
len = strlen(cr);
for(i = 0; i < len; i++)
{
r[0] = i % m;
r[1] = i / m % m;
r[2] = i / (m * m) % m;
for(j = 2; j >= 0; j--)//从第三个转盘开始解密
{
if(cr[i] - r[j] >= 'A')
temp = cr[i] - r[j];
else
temp = cr[i] + m - r[j];
for(k = 0; k < m; k++)
{
if(temp == ini[j][k])
{
temp = alph[k];
break;
}
}
if(temp + r[j] < 'A' + m)
cr[i] = temp + r[j];
else
cr[i] = temp - m + r[j];
res[i] = cr[i];
}
}
for(i = 0; i < len; i++)
printf("%c", res[i] + 32);
printf("\n");
}
}
return 0;
}
zoj1009 Enigma
最新推荐文章于 2019-03-26 21:30:21 发布