您的位置:首页 > 其它

UVA10878水题

2014-10-16 21:02 183 查看
对于这道题我已经无力吐槽,也许是我想象力不够,看了半天也没看出来,

而且UVA把题给成那样,懒的去数多少行,本来打算数的懂了一下就找不到数到哪了,

看了下题解也是醉了,想象力看来很重要:

输入从上往下看,可以看成题目所说的一段磁带。

题目给的信息很少,因此大部分信息要从输入输出得到。

(相当于给你一段明文跟密码,然后你破解其中的加密规则)

首先我们发现,磁带一共有43行,跟密码的字符个数一样(换行包括在内)。

可以猜测是否磁带的一行,代表一个字符。

然后我们可以发现,密码中相同的字符,在磁带里面的对应行,也是相同的。

更加坚定我们的猜测。

然后我们观察磁带里每行的结构。

其整体的格式一样,只有 “o” 的位置和数量有不同。

而且 “o” 只会在固定的7个位置出现。

则 7 个位置,一共可以表示出 2^7=128 种字符。

联系字符的整型特征(ASCII码),

可以猜测,磁带的每行表示着一个二进制数,这个二进制数的数值正好是对应字符的ASCII码。

看一下空格(ASCII码为32)的对应行 “ o . ”,

把行中的空格看作0,“o” 看作1,则可以得到二进制数0100000,正好是32。

破译完毕。

代码:

#include<cstdio>

#include<cstring>

#include<cctype>

#include<algorithm>

#include<iostream>

#include<cstdlib>

using namespace std;

int main()

{

int c[]={0,0,64,32,16,8,0,4,2,1,0};

char str[15];

gets(str);

while(gets(str)&&str[0]!='_')

{

int value=0;

int len=strlen(str);

for(int i=2;i<len;i++)

if(str[i]=='o')

value+=c[i];

printf("%c",value);

}

return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: