zoj1009 Enigma

/********************************************************************************************
 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;
}

    
    
   
   
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值