2009NOIP试题解析.pdf

  1. 1、本文档共28页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
2009NOIP试题解析

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

文档评论(0)

xxj1658888 + 关注
实名认证
内容提供者

教师资格证持证人

该用户很懒,什么也没介绍

领域认证该用户于2024年04月12日上传了教师资格证

1亿VIP精品文档

相关文档