`
azure_sky
  • 浏览: 12535 次
  • 性别: Icon_minigender_1
  • 来自: 上海
最近访客 更多访客>>
社区版块
存档分类
最新评论

解题笔记 之 1009 恶心的模拟

阅读更多

ZJU OJ 1009 Enigma

 

比较晕的模拟题目,倒过来算circuit偏差值就可以,逻辑很简单,但有点绕

 

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAX 1000
#define ROTOR_COUNT 3
#define INDEX(i) ((i + size)%size)
#define reset_rotors rotors[0].revolve_times = rotors[1].revolve_times = rotors[2].revolve_times = 0;

typedef struct _rotor {
    int circuit[27];
    int revolve_times;
} Rotor;

Rotor rotors[3];
static int size;

void setup_rotors();
void decrypt(char* word);
char decrypt_one_char(char c);
void revolve_rotors();

int main(int argc, char** argv) {
    int case_number = 1;
    char words[MAX];
      
    scanf("%d", &size);
    while(size) {       
        int case_size, i;
        printf("Enigma %d:\n", case_number);
       
        setup_rotors();
       
        scanf("%d", &case_size);
        for(i = 0; i < case_size; i ++) {
            scanf("%s", words);
            decrypt(words);
            reset_rotors;
        }
       
        scanf("%d", &size);       
        case_number ++;
        if(size) putchar('\n');
    }   

    return 0;
}

void setup_rotors() {
    int i, index;
   
    reset_rotors;
   
    for(i = 0; i < ROTOR_COUNT; i ++) {
        char table[27];
        scanf("%s", table);
        for(index = 0; index < size; index ++) {
            rotors[i].circuit[table[index] - 'A'] = 'A' + index - table[index];
        }
    }
}

void decrypt(char* word) {
    char orig_words[MAX], c;
    int i, word_length = strlen(word);
    for(i = 0; i < word_length; i ++) {
        orig_words[i] = decrypt_one_char(word[i]);
    }
    orig_words[i] = '\0';
    printf("%s\n", orig_words);
}

char decrypt_one_char(char c) {
    int i;
    for(i = ROTOR_COUNT - 1; i >= 0; i --) {
        c = (rotors[i].circuit[INDEX(c - 'A' - rotors[i].revolve_times)] + c - 'A' + size)%size + 'A';       
    }
    revolve_rotors();
   
    return c - 'A' + 'a';
}

void revolve_rotors() {
    int i = 0;
   
    for(rotors[0].revolve_times += 1; i < ROTOR_COUNT, rotors[i].revolve_times == size; i ++) {
        rotors[i].revolve_times = 0;
        rotors[i + 1].revolve_times += 1;
    }
}


 
分享到:
评论

相关推荐

    模拟电子技术解题题典.pdf

    模拟电子技术解题题典模拟电子技术解题题典.pdf模拟电子技术解题题典.pdf模拟电子技术解题题典.pdf模拟电子技术解题题典.pdf

    《模拟电子技术基础》学习指导与解题指南 杨拴科

    由于时间和水平的限制,书中难免会有错误和不足之处,编者诚恳地希望读者能够批评指正。同时,编者也在书中附有高等教育出版社的版权声明,强调了版权保护的重要性和对侵权行为的严厉打击,以维护市场秩序和读者的...

    hdoj解题笔记1

    【标题】:“hdoj解题笔记1”讨论了如何解决HDU 12411题,即“油藏”问题。 【描述】:这是一个关于寻找并计数地图上不同油藏的问题,地图由“*”(无油)和“@”(油藏)表示。相邻的油藏被视为同一油藏的一部分,...

    数字电子模拟电子解题方法

    "数字电子模拟电子解题方法"这一主题旨在帮助学习者掌握这两部分的核心概念、原理及解题技巧,以便进行自我提升或应对相关考试。以下是根据标题和描述所涉及的知识点的详细说明: 1. **数字电子基础**: - **布尔...

    模拟电子技术基础解题指南-唐竞新

    《模拟电子技术基础解题指南-唐竞新》是一本面向学习模拟电子技术的专业书籍,书中通过大量的例题和习题,详细讲解了模拟电子技术中各类问题的解题思路和方法。 首先,模拟电子技术基础涉及的核心器件包括半导体...

    模拟电子技术基础解题指南(唐竞新)

    《模拟电子技术基础解题指南》是唐竞新编著的一部针对模拟电子技术学习者的重要参考书籍。这本书提供了丰富的例题和详细的解答过程,帮助读者更好地理解和掌握模拟电子技术中的各种概念和解题方法。本文将根据给定的...

    帮你学模拟电子技术基础释疑、解题、考试-华成英主编

    华成英老师的帮你学,里面有模拟试题,而且是PDF版本的!

    Java相关解题算法笔记

    Java 相关解题算法笔记 本资源摘要信息涵盖了 Java 相关解题算法笔记的知识点,包括合并两个有序链表、括号生成等算法问题的解决方案和思路分析。 合并两个有序链表 合并两个有序链表是指将两个升序链表合并为一...

    系统分析师模拟试题及解析笔记

    10. **交流讨论**:建议考生们互相交流解题思路,共同讨论模拟试题中的难题,这将有助于拓宽思维,提升问题解决能力。 总之,"系统分析师模拟试题及解析笔记"是备考的重要工具,不仅提供了实践机会,还帮助考生深入...

    大物上册手写笔记.pdf

    同时,由于笔记出自高分同学之手,其对知识的提炼和解析很可能具有独到之处,有助于学生站在更高的角度理解物理原理,提升学习效率。 总的来说,这份【大物上册手写笔记.pdf】不仅是西电大学物理课程的重要参考资料...

    模拟电子线路解题指南.pdf

    模拟电子线路解题指南,关于模拟电子的一些知识,希望对需要这方面资料的有所帮助,里面包括模拟电子的相关介绍和解题思路。

    用C语言模拟数独的人工解题思路

    C语言作为一门基础且强大的编程语言,可以用来模拟数独的解题过程。下面将详细阐述如何用C语言模拟数独的人工解题思路。 1. **初始化数独矩阵** 在C语言中,我们可以使用二维数组来表示数独的9×9矩阵。初始化时,...

    算法笔记和算法笔记-上机训练实战指南整套-胡凡

    5. **模拟算法比赛**:模拟算法竞赛的流程,让学习者在模拟环境中锻炼解题速度和质量。 通过这两个部分的学习,读者不仅能建立起扎实的算法基础,还能提升实际编程和解决问题的能力,对参加PAT和CCSP等认证考试或...

    罗增儒-数学解题学引论\罗增儒 解题学引论153-203.pdf

    在罗增儒的《数学解题学引论》中,作者深入探讨了数学解题过程中的关键环节和方法论。本书的第四章专注于解题观点,提供了对于问题解决策略的深刻洞察。罗增儒通过具体案例,阐释了在解决问题时如何有效地利用信息...

    15浙大机试模拟赛解题报告+数据.zip

    《浙江大学考研计算机复试:15浙大机试模拟赛解题报告+数据解析》 在计算机科学与技术的考研过程中,尤其是浙江大学的复试环节,机试是至关重要的一环。这份"15浙大机试模拟赛解题报告+数据.zip"文件正是针对这一...

    leetcode答案-LeetCode:解题笔记

    这个压缩包文件 "leetcode答案-LeetCode:解题笔记" 显然是一个与LeetCode相关的资源集合,可能包含了用户在解决LeetCode题目时的解题思路、答案和学习笔记。 解题笔记是学习和掌握LeetCode算法问题的关键,它们通常...

    罗增儒-数学解题学引论\罗增儒 解题学引论52-152.pdf

    《罗增儒-数学解题学引论》一书由罗增儒所著,全书深入探讨了数学解题的思维过程,旨在剖析解题的思路,解析发现和发明的方法与规则,这与乔治·波利亚(George Pólya)的《怎样解题》有着异曲同工之妙。...

Global site tag (gtag.js) - Google Analytics