example 4-4
本题为刘的算法竞赛第二版的第四章例题之一,本题巧妙地构建了一个解码用的函数头的二维数组,具体的代码如下:
#include <stdio.h>
#include <string.h>
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 code[8][1<<8];//256
int readcodes()
{
int i, len;
memset(code, 0, sizeof(code));
code[1][0] = readchar();//对应于0的函数头
for (len = 2; len <= 7; len++)
{
for (i = 0; i < (1<<len)-1; i++)//以3,7,15...个为一组的函数头
{
int ch = getchar();
if (ch == EOF)
return 0;
if (ch == '\n' || ch == '\r')
return 1;
code[len][i] = ch;
}
}
return 1;
}
int main()
{
while (readcodes())//当读到函数头时
{
for (;;)
{
int len = readint(3);//因为函数头固定为三个二进制位
if (len == 0) break;
for (;;)
{
int v = readint(len);//读函数头规定二进制位的二进制并转换为十进制
if (v == (1 << len)-1) break;//如果二进制位均是1那么退出循环
putchar(code[len][v]);//输出对应的编码
}
}
putchar('\n');
}
return 0;
}