文档详情

NOIP试题解析NOIP试题解析.pdf

发布:2018-04-22约1.48万字共28页下载文档
文本预览下载声明
2009NOIP试题解析 潜伏者 R国和S 国正陷入战火之中,双方都互派间谍,潜入对方内部,伺机行动。伏于S 国的R国间 谍小C终于摸清了S 国军用密码的编码规则: 1、S 国军方内部欲发送的原信息经过加密后在网络上发送,原信息的内容与加密后所的内容 均由大写字母‘A ’— ‘Z ’构成(无空格等其他字母)。 2、S 国对于每个字母规定了对应的“密字”。加密的过程就是将原信息中的所有字母替换为 其对应的“密字”。 3、每个字母只对应一个唯一的“密字”,不同的字母对应不同的“密字”。“密字”可以 和原字母相同。如,若规定‘A ’的密字为‘A ’,‘B’的密字为‘C ’(其他字母及密字略), 则原信息“ABA ”被加密为“ACA ”。 现在,小C通过内线掌握了S 国网络上发送的一条加密信息及其对应的原信息。小C希望能通 过这条信息,破译S 国的军用密码。小C的破译过程是这样的:扫描原信息,对于原信息中的字 母x (代表任一大写字母),找到其在加密信息中的对应大写字母y ,并认为在密码里y是x 的密 字。如此进行下去直到停止于如下的某个状态: 1、所有信息扫描完毕,‘A ’— ‘Z ’所有26个字母在原信息中均出现过并获得了相应的“密 字”。 2、所有信息扫描完毕,但发现存在某个(或某些)字母在原信息中没有出现。 3、扫描中发现掌握的信息里有明显的自相矛盾或错误(违反S过密码的编码规则)。例如某 条信息“XYZ ”被翻译为“ABA ”就违反了“不同字母对应不同密字”的规则。 在小C忙得头昏脑胀之际,R国司令部又发来电报,要求他翻译另外一条从S 国刚刚截取到的 加密信息。现在请你帮助小C :通过内线掌握的信息,尝试破译密码。然后利用破译的密码,翻 译电报中的加密信息。 思路点拨 简单的模拟题,考察基本编程和全面细致考虑问题的能力。 由“每个字母只对应一个唯一的“密字”,不同的字母对应不同的 “密字”,“密字”可以和原字母相同”的条件,可以得出“密字”和原 26个字母是构成一个一一对应的关系的。设 加密信息为s1、原信息为s2、要求翻译的加密信息为s3; 密信息与原信息的对应关系为c和c2,其中c[X]表示s1串中字母X对应 s2串中的字母,c2[X]表示s2串中字母X对应s1串中的字母。 左到右扫描到字串第i位时,s1[i]和s2[i]要么都还没配对,要么已 经相互配对了(即c[s1[i]]=s2[i],c2[s2[i]]=s1[i])。如果两个条件都 不符合,则输出Failed并结束程序。 若扫描完毕未出现Failed的情况,则判断c数组是否每个字母都有其 对应的字母。 var c,c2:array[char]of char; /* 加密信息与原信息的对应关系*/ s1,s2,s3:string; /*加密信息、原信息和要求翻译的加密信息*/ ch:char; i:longint; { readln(s1); readln(s2); readln(s3); /*输入加密信息、原信息和要求翻译的加密信息*/ for ch←A to Z do { c[ch+←@; c2*ch+←@ -; /*加密信息与原信息的对应关系为空*/ for i←1 to length(s1) do /*从左到右扫描*/ { if(c[s1[i++=‘@’)and(c2[s2[i++=‘@’) then, c*s1*i++←s2*i];c2[s2[i++←s1*i];continue }; /*若s1[i] 和s2[i]未配对,则建立对应关系,往右扫描*/ if (c[s1[i]]=s2[i])and(c2[s2[i]]=s1[i]) then continue else{ writeln(‘Failed’); exit -/*若s1[i] 和s2[i]配对,则往右扫描;否则失败退出*/ };/*for*/ for ch←‘A’ to ‘Z’ do if c[ch+=‘@’ then , writeln(‘Failed’);exit -; /*若存在未解码的密字, 则失败退出*/ for i←1 to length(s3) do write(c*s3*i]]); /*输出译文*/ writ
显示全部
相似文档