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)