213 - Message Decoding (UVA)

题目链接如下:

Online Judge

这题挺烦的,我题目看了好几遍才看懂……信息解码(Message Decoding)ACM/ICPC World Finals 1991,UVa 213_一封信笺等一前缘的博客-CSDN博客

上面这篇用的是刘汝佳的解法,他里面保存header的方式特别好;我的方法比较傻,先把二维数组映射到顺序号(0, 1, 2, ...),再从原header中取得相应的char。刘汝佳是直接保存的,高效很多……

我的代码如下:

#include 
#include 
#include 

int f[8][128];
std::string str, opcode;
int sz, temp, maxTemp;
char ch;

int main(){
    for(int i = 1; i <= 7; ++i){
        f[i][0] = pow(2, i) - i - 1;
        for(int j = 1; j < pow(2, i) - 1; ++j){
            f[i][j] = f[i][0] + j;
        }
    }
    while(getline(std::cin, str)){
        while(1){
            opcode.clear();
            for(int i = 0; i < 3; ++i){
                while(scanf("%c", &ch) == 1 && !isdigit(ch)){}
                opcode += ch;
            }
            if(opcode == "000"){
                getchar();
                printf("\n");
                break;
            }
            sz = (opcode[0] - '0') * 4 + (opcode[1] - '0') * 2 + (opcode[2] - '0');
            maxTemp = pow(2, sz) - 2;
            while(1){
                temp = 0;
                for(int i = 0; i < sz; ++i){
                    while(scanf("%c", &ch) == 1 && !isdigit(ch)){}
                    temp = temp * 2 + (ch - '0');
                }
                if(temp > maxTemp){
                    break;
                }
                printf("%c", str[f[sz][temp]]);
            }
        }
    }
    return 0;
}

你可能感兴趣的:(UVA,算法,c++)