例题4-4 信息解码 UVa213

来源:互联网 发布:psd头像源码怎么使用 编辑:程序博客网 时间:2024/06/06 03:42

算法竞赛入门经典(第2版)第4章 函数和递归

例题4-4 信息解码  UVa213

感悟。

1、阅读书中题目,从网站下载英文原题,重点在看输出数据与格式。

2、回忆起用左移来计算二进制数。

3、调试了半天,才发现,1<<n-1等价于1<<(n-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 <stdio.h>
#include <string.h>

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<<len)-1;i++){
            ch=getchar();
            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<<len)-1)
                    break;
                putchar(codes[len][i]);
            }
        }
        putchar('\n');
    }
    return 0;
}

0 0
原创粉丝点击