您的位置:首页 > 其它

ZOJ--1009:Enigma

2017-06-13 18:46 483 查看
我的思路: 真的是这个题的用例给的真他妈坑     让我直接会错意了     看懂这个题 感觉过了一个世纪

                    这里用我的用例吧

                     输入:6

                                 BADFEC      样例中位移量为(1 -1 3 -1 0 -2)转动一次后为(-2 1 -1 3 -1 0)A倒退两个位置到E上,B前进一个位置到C上 其他同理得(DCBEAF)

                                 ACDEFB                                  (0 4 -1 -1 -1 -1)
                                 BADFEC                                  (1 -1 3 -1 0 -2)

                                1

                                ACE  

                                0  //0为结束标志

                    输出:Enigma 1:              //这里的数字是第几个用例   不是有几个密文(我刚开始就一直以为是几个密文的意思 妈的坑死了)

                                ddc

                    做法:这个密文是经过三次加密的,什么意思呢。(这里以我的用例 为例)就是你在第一个转子按的字母a显示的对应的字母为B,B在第二个转子对应的是C,C在第三个对应的是D,所以按下a 显示的是D;因此,我们要找对应的明文,就应该从第三个转子开始。按完一个
转动一次;第一个转够一圈 第二个转一下,第二个转够一圈,第三个转一下;这里三个转子像钟表的时分秒一样。

                                 1. 首先我们看第一个密文是A,说明三次加密之后显示的是A;在第三个转子里找到A,在B的位置上,说明第二个转子显示的为B,然后在第二个转子里找B,B在F的位置上,说明第一个转子显示的是F,在第一个转子上找F,F在D的位置上,说明是按下D显示的A,对应的明文为d; 

                                 2.第二个密文C,在第三个转子里找到C,在F的位置上,然后在第二个转子里找F,在E的位置上,在第一个转子里找E,因为这是第二个密文,所以这里第一个转子是转过一次的(DCBEAF),E在D的位置上,所以对应的明文为d;

                                 3.第三个密文E,在第三个转子里找到E,在E的位置上,然后在第二个转子里找E,在D的位置上,在第一个转子里找D,因为这是第三个密文,所以这里第一个转子是转过二次的(AEDCFB),D在C的位置上,所以对应的明文为c;

                                 所以,答案为:ddc

             原题中给的样例 第二个和第三个转子都是ABCDEF 所以第一个转子按下去之后,对应的是什么字母 之后两个显示的也是什么字母;我就以为直接在第一个上显示 让我WA了无数遍 才搞清楚。

java代码:

import java.util.Scanner;

public class Enigma1009 {
static int n,m;
static int flag=0;
static int pos[][]=new int[3][27];
static int state[]=new int [3];
static String str;
public static void main(String[] args) {
Scanner s=new Scanner(System.in);
while((n=s.nextInt())!=0){
if(flag>0)System.out.println();
flag++;
for(int i=0;i<3;i++){
str=s.next();
for(int j=0;j<n;j++)
pos[i][str.charAt(j)-'A']=-(str.charAt(j)-('A'+j));//若括号里是整数,则该字母的实际位置在他现在所在位置的下面,加‘-’号
}
m=s.nextInt();
System.out.println("Enigma "+flag+":");
while(m!=0){
str=s.next();
for(int i=0;i<str.length();i++){
state[0]=i%n;                //这里计算转了几次
state[1]=i/n%n;              //这里计算第二个转子转了几次
state[2]=i/(n*n)%n;          //这里计算第三个转子转了几次
int temp=str.charAt(i)-'A';
for(int j=2;j>=0;j--){
temp+=pos[j][(temp-state[j]+n)%n];
temp=(temp+n)%n;
}
System.out.print((char)(temp+'a'));
}
System.out.println();
m--;
}
}
}
}

C++:<
b595
/p>

#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
int main() {
int n;
int pos[3][26];
int state[3];
int flag=0;
char s[1000];
while(cin>>n&&n){
if(flag>0) cout<<endl;
flag++;
cout<<"Enigma "<<flag<<":"<<endl;
for(int i=0;i<3;i++){
cin>>s;
for(int j=0;j<n;j++)
pos[i][s[j]-'A']=-(s[j]-('A'+j));
}
int num;
cin>>num;
while(num--){
cin>>s;
for(int i=0;i<strlen(s);i++){
state[0]=i%n;
state[1]=i/n%n;
state[2]=i/(n*n)%n;
int temp=s[i]-'A';
for(int j=2;j>=0;j--){
temp+=pos[j][(temp-state[j]+n)%n];
temp=(temp+n)%n;
}
printf("%c",temp+'a');
}
cout<<endl;
}
}
return 0;
}


第二种方法:

import java.util.Scanner;

public class Enigma1009 {
static int n,m;
static int flag=0;
static int pos[][]=new int[3][27];
static int tmp[]=new int[2];
static int m1[]=new int[27],m2[]=new int[27];
static int msg[]=new int[1005];
static String str;
public static void main(String[] args) {
Scanner s=new Scanner(System.in);
while((n=s.nextInt())!=0){
if(flag>0)System.out.println();
flag++;
for(int i=0;i<3;i++){
str=s.next();
for(int j=0;j<n;j++)
pos[i][j]=((str.charAt(j)+n)-('A'+j))%n;
}
m=s.nextInt();
System.out.println("Enigma "+flag+":");
for(int i=0;i<m;i++){
str=s.next();
for(int j=0;j<str.length();j++)
msg[j]=str.charAt(j)-'A';
for(int j=0;j<str.length();j++){
for(int k=0;k<n;k++){
m1[k]=(k+pos[2][(k+(n-j/(n*n)%n))%n])%n;
m2[m1[k]]=k;
}
tmp[0]=m2[msg[j]];
for(int k=0;k<n;k++){
m1[k]=(k+pos[1][(k+(n-j/n%n))%n])%n;
m2[m1[k]]=k;
}
tmp[1]=m2[tmp[0]];
for(int k=0;k<n;k++){
m1[k]=(k+pos[0][(k+(n-j%n))%n])%n;
m2[m1[k]]=k;
}
System.out.print((char)('a'+m2[tmp[1]]));
}
System.out.println();
}
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: