信息解码(Message Decoding, ACM/ICPC World Finals 1991, UVa 213)算法竞赛入门

    操作过程:① 输入编码头

                     ②输入编辑文本

                     ③根据编码文本输出相应的编码头里的字符

    思路 :     ①读取文本编码的头三个数字(因为头三个数字代表着读取多少个字符)

                    ②确定读取n个为一组的二进制数

                    ③将相应的二进制数转化为十进制数

                    ④ 将对应数组里的字符输出

    重点:数组的安排非常重要 。这里的code[len][value], len 表示的二进制数的长度,value表示的是二进制数转换成对应的十进制数


#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 readcodes()
{
	memset(code,0,sizeof(code));
	//不是很清楚,为什么第一个需要用readchar()
	//解释说是:编码头是单独一行,所以要用这种方法
	code[1][0] = readchar();
	for(int len = 2; len <= 7; len++)
	{
		for(int i = 0; i < ((1 << len) - 1); i++)
		{
			//这里的ch是int类型的,需要思考
			//应该是把字符也强制转换了吧。 
			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;
				putchar(code[len][v]);
			}
		}
	putchar('\n');	
	}
	return 0;
}
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值