思路来自紫书。。。开始时的思路估计100行+,果断放弃!
关键:
1.正确提取出函数!
   initmap():初始化字母与整数的映射。
   returnint(x):向后读取x位,并转换为十进制数返回。
   enterfilter():获取下个字符,跳过回车。
   所以,
   不断initmap()构建映射表直到结尾;
   对于每组编码表,
   使用returnint(x)一直读取并返回;
   这其中又涉及到回车的干扰,所以使用enterfilter()。
2.逐个字符读取的应用。
   其实还很方便啦~\(≧▽≦)/~。。之前有些畏惧心理~(害怕.jpg)
3.映射表的构建
   使用(对应二进制码)长度与该长度下该字母的序数来定位,可以很方便使用
   很好用!
4.二进制转十进制:乘二加下一位。。。并循环!

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn=8;
char letter[maxn][1<<maxn];

char enterfilter()
{
    for(;;)
    {
        char x=getchar();
        if(x!='\n'&&x!='\r')return x;
    }
}
int returnint(int x)
{
    int ans=0;
    while(x--)
        ans=ans*2+enterfilter()-'0';
    return ans;
}
bool initmap()
{
    memset(letter,0,sizeof(letter));
    letter[1][0]=enterfilter();/////to filter the line-break remained 
    if(letter[1][0]==EOF)return false;
    for(int i=2;i<=maxn;i++)
        for(int j=0;j<((1<<i)-1);j++)
        {
            char ch=getchar();
            if(ch=='\n'||ch=='\r')return true;           
            letter[i][j]=ch;           
        }   
}
int main()
{
    while(initmap())
    {    
        for(;;)
        {
            int len=returnint(3);
            if(!len)break;
            for(;;)
            {
                int x=returnint(len);
                if(x==(1<<len)-1)break;     
                printf("%c",letter[len][x]);
            }
        }
        printf("\n");
    }

    return 0;
}

 

 posted on 2016-09-01 18:10  cylcy  阅读(392)  评论(0编辑  收藏  举报