UVa 213 Message Decoding (信息编码)

该题目作为放假回归正轨的第一道正式做的题目,被卡了好久,唉,怪我有颗太浪的心

解题思路:

1、把编码头用二维字符数组存储起来,a[x][y]存储对应的字符,x表示编码的长度,y表示编码的大小,

存储时注意y<2^x - 1的

2、由于编码文本可能是由多行组成,所以需要判断和跳过对换行符的处理,为方便处理,将编码文本视作字符处理

#include<iostream>
#include<CString>
#include<cmath>
#include<stdlib.h>
using namespace std;
char a[8][64];
int get(int x)
{//算出长度为x的编码的值 
    char a;
    int s = 0;
    while (a = getchar())
    {
        if (a != '\n' && a != '\r')
        {
            x--;
            s += (int)(pow(2, x) * (a - '0'));
            if (x == 0) break;
        }
    }
    return s;
}
int main()
{
    memset(a, 0, sizeof(a));
    for (int i = 1; i < 8; i++)
    {//将编码头存储到二维字符数组中 
        int flags = 0;
        for (int j = 0; j < pow(2, i) - 1; j++)
        {
            char b = getchar();
            if (b == '\n' || b == '\r')
            {
                flags = 1;
                break;
            }
            else
                a[i][j] = b;

            }
            if (flags == 1)
                break;
    }
    int L, S; 
    while (true)
    {
        L = get(3);//小节中每个编码的长度 
        if (L == 0) break;//000代表文本结束 
        while (true)
        {//对小节中的每个编码进行解码 
            S = get(L);
            if (S == pow(2, L) - 1)
                break;
            else
                cout << a[L][S];
        }
    }
    cout << endl;
    system("pause");
}

 

posted @ 2018-03-22 20:45  hui666  阅读(141)  评论(0编辑  收藏  举报