UVa 213,World Finals 1991,信息解码

Posted 树的种子

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了UVa 213,World Finals 1991,信息解码相关的知识,希望对你有一定的参考价值。

题目链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=149

紫书P83

解题报告:

思路很巧。每个字符这样记录,由于同一个值可能有好几种对应,比如0,00,000,这样用一个二维数组code[len][v] 记录字符。

二进制再熟悉一遍。扫一遍长度为len的二进制所有数值。for(int v = 0;v<(1<<len)-1;v++)

#include <stdio.h>
#include <string.h>

int code[8][1<<8];

int readchar()
{
    for(;;)
    {
        int ch = getchar();
        if(ch != \'\\n\' && ch != \'\\r\') return ch;
    }
}


int readint(int c) {
  int v = 0;
  while(c--) v = v * 2 + readchar() - \'0\';
  return v;
}


int readcode()
{
    memset(code,0,sizeof(code));
    code[1][0] = readchar();
    for(int i = 2; i<=7; i++)
    {
        for(int j=0; j<(1<<i)-1; j++)
        {
            int ch = getchar();
            if(ch==EOF) return 0;
            if(ch==\'\\n\'||ch==\'\\r\') return 1;
            code[i][j] = ch;
        }
    }
    return 1;
}

void printcodes()
{
    for(int len = 1; len <= 3; len++)
        for(int i = 0; i < (1<<len)-1; i++)
        {
            if(code[len][i] == 0) return;
            printf("code[%d][%d] = %c\\n", len, i, code[len][i]);
        }
}


int main()
{
    //freopen("input.txt","r",stdin);
    while(readcode())
    {
        while(true)
        {
            int len = readint(3);
            if(len == 0) break;
            while(true)
            {
                int v = readint(len);
                if(v == (1 << len)-1) break;
                putchar(code[len][v]);
            }
        }
        putchar(\'\\n\');
    }
    return 0;
}

 

以上是关于UVa 213,World Finals 1991,信息解码的主要内容,如果未能解决你的问题,请参考以下文章

[算法竞赛入门经典]Message Decoding,ACM/ICPC World Finals 1991,UVa213

信息解码,ACM/ICPC World Finals 1991

World Finals 1996 Uva (Floyd求闭包)

[算法竞赛入门经典] Crossword Answers ACM/ICPC World Finals 1994,UVa232

[算法竞赛入门经典]Repeating Decimals, ACM/ICPC World Finals 1990,UVa202

习题6-8 空间结构(Spatial Structures, ACM/ICPC World Finals 1998, UVa806)