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代码:
C++:<
b595
/p>
第二种方法:
这里用我的用例吧
输入: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(); } } } }
相关文章推荐
- [ZOJ 1009] Enigma (模拟)
- zoj&nbsp;1009&nbsp;enigma
- ZOJ 1009 Enigma
- ZOJ 1009 Enigma
- ZOJ1009 Enigma
- ZOJ 1009 Enigma
- Zoj 1009 Enigma
- zoj 1009 Enigma (模拟)
- ZOJ Problem Set - 1009 Enigma(待想通)
- 浙大ZOJ 1009 Enigma问题解决及别人的解决方案
- ZOJ1009 Enigma
- ZOJ1009 Enigma
- ZOJ Problem Set - 1009
- 1009 Enigma
- ZOJ 1009 转子加密
- POJ 1449 & ZOJ 1036 Enigma(简单枚举)
- ZOJ 1009, 1115, 1476, 1733, 2405 解题报告
- ZOJ Problem Set - 1009
- zoj上面的题1009~~~~
- ZOJ1009解题报告