- 1、本文档共28页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 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)