World Finals >> 1991 - San Antonio

问题链接:UVA213 UVALive5152 Message Decoding

问题简述:参见问题链接。

问题分析:(略)。

程序中,若干功能封装到函数中,使得程序逻辑变得简洁。

AC的C语言程序如下:

/* UVA213 UVALive5152 Message Decoding */

#include <stdio.h>
#include <memory.h>

#define CODE_LEN 7

int code[CODE_LEN+1][1<<(CODE_LEN+1)];

int readchar()
{
    int c;

    while((c=getchar()) && (c == '\n' || c == '\r'));

    return c;
}

int readcodes()
{
    int i, j;
    char c;

    memset(code, 0, sizeof(code));

    code[1][0] = readchar();

    for(i=2; i<=CODE_LEN; i++) {
        int len = (1<<i)-1;
        for(j=0; j<len; j++) {
            if((c = getchar()) == EOF)
                return 0;
            else if(c == '\n' || c == '\r')
                return 1;
            code[i][j] = c;
        }
    }

    return 1;
}

int readint(int len)
{
    int v = 0;

    while(len--)
        v = v * 2 + readchar() - '0';

    return v;
}

int main(void)
{
    while(readcodes()) {
        for(;;) {
            int len = readint(3);
            if(len == 0)
                break;
            for(;;) {
                int v = readint(len);
                if(v == (1 << len) - 1)
                    break;
                putchar(code[len][v]);
            }
        }
        putchar('\n');
    }

    return 0;
}