算法竞赛入门经典(第2版)第4章 函数和递归
例题4-4 信息解码 UVa213
感悟。
1、阅读书中题目,从网站下载英文原题,重点在看输出数据与格式。
2、回忆起用左移来计算二进制数。
3、调试了半天,才发现,1<
4、调试了半天,才发现,%o是输出八进制,一直误认为是二进制,总算纠正。
5、十进制转二进制,要自个写,很快就写好了,一个栈,加上除法的余数处理。
6、编码字符串可以有多行,再读取编码字符串过程中,花了很长时间。
7、根据其固定格式,先读前3位,计算编码位数,根据位数读取编码,及编码结束符,之后再读取接写来3位,判断编码内容是否完全结束,若无,那读取的就是接下来的编码位数,重复过程上述过程。
8、边写边调,个中各种痛苦,只有自己知道。
9、测试阶段,发现输入的英文字母中可有有空格,昏倒,马上将scanf改成getchar,在处理(c=getchar())=='\n'又费了许多周折,不过,对getchar使用更熟练了。
10、这个程序断断续续,编了有四天时间,没看任何参考和提示,收获挺大,挺值,全是自个摸索出来的,虽然代码有134行。
11、提交Runtime error,马上将数组由1000开到10000,提交Runtime error,继续将数组由10000开到100000,提交,Runtime error,继续将数组由100000开到1000000,提交Runtime error,傻了,接下来,休息一会。
12、考虑数组可能越界的地方,修改,提交Runtime error,到极限了,很想看书中的解答,但是还是忍一忍,再看看能不能修改对。
13、重读了一遍英文原题,还是没有什么收获,参看http://blog.csdn.net/thudaliangrx/article/details/50700688只有60行,提交此60行代码,AC,编译运行结果如下,
请看作者一直Runtime error的运行结果。
大家看出差别了吗,是李逵遇到李鬼吗?60行代码是读一行,翻译一行;作者代码是全部读取完毕后,进行翻译。
附上英文原题输出格式部分:
大家看出哪种输出格式是对的吗?
14、输出格式一遍,代码修改体量就比较大了,硬着头皮上吧。
15、按上面输出要求改了一遍,代码有189行,提交TLE,将数组从10000000开到1000,提交Runtime error。
16、此题暂时搁置,先学习书中写法,待日后有机会再试试。五天啦。
17、模仿书本,重复了一遍代码(消化理解过,自个再一遍编码,编码时不看书,也费了些周折),提交AC。
18、此题暂且翻过去,待日后水平高后,再来试试自个的编码。看看此刻时间已是2016年8月11日22:07。
19、大概对UVa套路有些了解,这些解码或是游戏类,通常是一个字母翻译好,输出一个。本人通常是一个字符串翻译好,在输出,所以经常无法AC。
附上代码
环境Dev-cpp4.9.9.2
#include
#include
char codes[8][1<<8];
int readchar(){
char ch;
while(1){
ch=getchar();
if(ch!='\r'&&ch!='\n')
return ch;
}
}
int readcodes(){
int len;
int i;
char ch;
memset(codes,0,sizeof(codes));
codes[1][0]=readchar();
for(len=2;len<=7;len++)
for(i=0;i<(1<
if(ch==EOF)
return 0;
if(ch=='\n')
return 1;
codes[len][i]=ch;
}
return 1;
}
int readint(int c){
int v=0;
while(c--){
v=v*2+readchar()-'0';
}
return v;
}
int main(){
int len;
int i;
while(readcodes()){
while(1){
len=readint(3);
if(len==0)
break;
while(1){
i=readint(len);
if(i==(1<
putchar(codes[len][i]);
}
}
putchar('\n');
}
return 0;
}