算法习题---4.4信息解码(UVa213)
一:题目
消息编码方案要求在两个部分中发送一个被编码的消息。第一部分:称为头,包含消息的字符。第二部分包含一个模式
表示信息。你必须写一个程序,可以解码这个消息。
(一)题目详细
你的程序的编码方案的核心是一个序列的“0和1”的字符串 。 , , , , , , , , , , , , , . . . , , , , . . .(对应数字个数n,则表示的编码为2^n-1个) 序列中长度为1的1个,长度为2的3个,长度为3的7个,长度为4的15个。如果相邻两个具有相同的长度,第二可从第一个加1(2进制)。注意有序列中没有全都是1的串。 键被映射到标题中的字符。也就是说,第一个键()映射在标题的第一个字符,第二键()在头的二字符,k键映射到标头中的k个字符。
(二)案例
例如,假设标题是:AB#TANCnrtXc (可以包含空格) 然后0映射到A,00映射到B,01映射到#,10映射到T,000映射到A,…,110映射到X,0000映射到c. 该编码的信息包含0和1的和可能的回车,这是被忽略。消息分为段。一个段的前3位数字为二进制表示在段的键的长度。例如,如果前3位数字为010,则其余该段由长度为2(,,或10)。段的结束是1的字符串
在段中的键长度相同。因此一段长度2的键是终止11。整个编码的信息被000终止(这将意味着一段段其中的按键有0个)。通过将该段中的键进行翻译,该消息被解码的标题字符已被映射。
(三)输入
输入文件包含多个数据集。
每个数据集包含一个标题,这是在一个单独的行就其本身而言,和一个消息,它可能会延续几行。
头的长度(由三个数据位表示,0-7--->最大长度为七)是有限的唯一的事实,有一个关键字符串的最大长度为7(111的二进制)。--->(由于最大长度为7,所以所表示的最大编码数为2^7-1)
如果有多个在头一个字符的副本,然后几个键将映射到字符。
编码信息仅包含0和1的,这是一个合法的编码,根据所描述的计划。那是,信息段的开始与适当的序列的序列长度和位数1,在任何给定的段的键都是相同的长度,并且它们都对应于字符标题。
该消息以000终止
TNM AEIOU 1010001001110110011 //允许换行
11000 //这才是结束
$#**\
0100000101101100011100101000 //结束
(四)输出
TAN ME ##*\$
二:代码实现
//信息解码,所有信息都属于ASCII码中
void Save_Encode(char Code_Header[MAX_LEN],char Encode[][],int CHT_Status)
{
//开始向编码中存放数据
//获取编码头--注意含有空格 int ch,i=;
if (!CHT_Status) //编码头没有获取
while ()
{
ch = getchar();
Code_Header[i++] = ch;
if (ch == '\n'||ch==EOF)
break;
} //将编码头数据放入编码中--最重要
int p,k = ;
for (i = ; i <= ; i++)
{
p = pow(2.0, i*1.0) - ;
for (int j = ; j < p; j++)
if (Code_Header[k] != '\n')
Encode[i][j] = Code_Header[k++];
else
return;
}
}
//获取编码文本到Code_Text
int Save_CodeText(char Code_Text[MAX_LEN], char Code_Header_Temp[MAX_LEN])
{
int ch, i; while ()
{
memset(Code_Header_Temp, , sizeof(Code_Header_Temp));
//获取一行到Code_Header_Temp
i = ;
while ()
{
ch = getchar();
Code_Header_Temp[i++] = ch==EOF?'\n':ch;
if (ch == '\n'||ch==EOF)
break;
}
if (Code_Header_Temp[] != '' && Code_Header_Temp[] != '')
return ;
//将临时数据连接到Code_Text中
if (strlen(Code_Text)>)
Code_Text[strlen(Code_Text)-] = ;
strcat(Code_Text, Code_Header_Temp);
}
return ;
}
//获取指定个数二进制文本的数值
int getVal(char* codeText,int n)
{
int val = ;
for (int i = n - ; i >= ;i--)
{
int k = ;
for (int j = ; j <= i; j++)
{
k *= ;
}
val += (*codeText-'')*k;
codeText++;
}
return val;
}
//处理数据,进行输出
void Deal_CodeData(char Encode[][], char* Code_Text)
{
int len,val,chk,k=; while ()
{
//找到编码长度
len = getVal(&Code_Text[k], );
Code_Text += ; //步长向后移动3个 if (len == ) //3个0退出
return; chk = pow(2.0, len*1.0) - ;
//根据长度,获取值
while ()
{
val = getVal(Code_Text, len);
Code_Text += len;
if (val == chk)
break; //去对应位置找编码数据
printf("%c", Encode[len][val]);
}
}
}
void func03()
{
FILE* fi = freopen("data.in", "r", stdin);
freopen("data.out", "w", stdout); //因为前三位表示长度,所以最长为7位其中七位编码最大为1111110可以表示2^7-1个数所以将列数设置为2^7=128
char Encode[][]; //操作二维数组,我们直接从1开始,忽略0带来的麻烦
//注意:每行只有2^n - 1 个有效 char Code_Header[MAX_LEN]; //存放编码头
char Code_Text[MAX_LEN]; //存放编码文本 char Code_Header_Temp[MAX_LEN]; //存放有可能的编码头 int CHT_Status=; //是否从临时数组中读取编码头 memset(Code_Header_Temp, , sizeof(Code_Header_Temp)); //开始进行读取处理数据
while (!feof(fi))
{
memset(Code_Text, , sizeof(Code_Text));
memset(Encode, , sizeof(Encode));
memset(Code_Header, , sizeof(Code_Header)); //将编码头数据保存到编码数组中
if (CHT_Status)
strcpy(Code_Header, Code_Header_Temp); Save_Encode(Code_Header, Encode,CHT_Status); //获取编码文本--文本可能不在同一行(难点)
//方法:一次获取一个字符
CHT_Status = Save_CodeText(Code_Text,Code_Header_Temp); //开始处理数据,并打印出来
Deal_CodeData(Encode,Code_Text);
printf("\n");
} freopen("CON", "r", stdin);
freopen("CON", "w", stdout);
}
算法习题---4.4信息解码(UVa213)的更多相关文章
- 把vux中的@font-face为base64格式的字体信息解码成可用的字体文件
在最近移动端项目中用到了vux,感觉用着还习惯,当把vux使用到PC端的时候出现了IE浏览器出现,这样的错误信息: CSS3114: @font-face 未能完成 OpenType 嵌入权限检查.权 ...
- 【算法习题】数组中任意2个(3个)数的和为sum的组合
题1.给定一个int数组,一个数sum,求数组中和为sum的任意2个数的组合 @Test public void test_find2() { int[] arr = { -1, 0, 2, 3, 4 ...
- 4_4 信息解码(UVa213)<二进制:输入技巧与调试技巧>
消息编码方案要求在两个部分中发送一个被编码的消息.第一部分:称为头,包含消息的字符.第二部分包含一个模式 表示信息.你必须写一个程序,可以解码这个消息. 你的程序的编码方案的核心是一个序列的“0和1” ...
- UVA213 信息解码
对于lrj的想法,真是太清晰.自己真的是很难去做到.贴此代码,加以练习,加以感悟. #include<cstdio> #include<cstring> ][<<] ...
- UVA 213 信息解码(二进制&位运算)
题意: 出自刘汝佳算法竞赛入门经典第四章. 考虑下面的01串序列: 0, 00, 01, 10, 000, 001, 010, 011, 100, 101, 110, 0000, 0001, …, 1 ...
- July 算法习题 - 字符串4(全排列和全组合)
https://segmentfault.com/a/1190000002710424 思想:当前层各节点首元素不同,则各节点的剩余元素也不同:下一层节点交换范围为首元素以外的元素 全排列算法: vo ...
- 算法习题---5-8图书管理系统*****<双向迭代器>(UVa230)
一:题目 就是输入一系列书本名和作者名,然后输入命令模拟借书和还书,再输出归还的书的摆放位置.要求有两点: 需要对归还的书做特殊排序处理:作者名相同,则书本按书名从小到大排序:否则书本按作者名大小排序 ...
- 算法习题---5-7打印队列(UVa12100)
一:题目 有一个打印机,有一些任务在排着队打印,每个任务都有优先级.打印时,每次取出队列第一个任务,如果它的优先级不是当前队列中最高的,就会被放到队尾,否则就打印出来.输出初始队列的第m个任务的打印时 ...
- 算法习题---5-6对称轴(UVa1595)
一:题目 判断平面上的一组点,是否关于一条竖线对称.即找到一条垂直对称轴 (一)样例输入 - (二)样例输出 YES NO YES 二:代码实现 #define _CRT_SECURE_NO_WARN ...
随机推荐
- python中is与==的区别,编码和解码
在介绍is与==的区别前,我们先来了解一些新的知识:内存地址.小数据池. 1.内存地址(is 比较的就是内存地址) 获取内存地址的方法:id() a = "str" 2.小数据池 ...
- jwt的原理以及使用
jwt原理(json web token) 我们之前是使用session实现登录,通过实际密码+盐组成字符串进行md5存入redis或者数据库中,输入的密码与实际校验通过,发送给客户端一个有效时间的t ...
- TCL服务器端
import socket def main(): # 创建套接字对象 tcp_server_socket = socket.socket(socket.AF_INET,socket.SOCK_STR ...
- vscode安装依赖报错 TypeError: zipfile.readEntry is not a function
错误原因是npm的版本太高,需要把5.x的版本换回4.x的 npm install npm@4 -g 或者 cnpm install npm@4 -g 详见:https://github.com/Mi ...
- 密码加密与微服务鉴权JWT详细使用
[TOC] 1.1.了解微服务状态 微服务集群中的每个服务,对外提供的都是Rest风格的接口,而Rest风格的一个最重要的规范就是:服务的无状态性. 什么是无状态? 1.服务端不保存任何客户端请求者信 ...
- HDU-2082-找单词(母函数)
链接: http://acm.hdu.edu.cn/showproblem.php?pid=2082 题意: 假设有x1个字母A, x2个字母B,..... x26个字母Z,同时假设字母A的价值为1, ...
- Airtest真机链接(一)
确认ADB是否能够正常连接到手机 windows系统下: 用USB线连好手机后,进入AirtestIDE文件夹,在 AirtestIDE_2019-05-09_py3_win64/airtest/co ...
- 47、[源码]-Spring容器创建-初始化MessageSource
47.[源码]-Spring容器创建-初始化MessageSource 7.initMessageSource();初始化MessageSource组件(做国际化功能:消息绑定,消息解析): 获取Be ...
- Codeforces Round #600 (Div. 2) D题【并查集+思维】
题意:给你n个点,m条边,然后让你使得这个这个图成为一个协和图,需要加几条边.协和图就是,如果两个点之间有一条边,那么左端点与这之间任意一个点之间都要有条边. 思路:通过并查集不断维护连通量的最大编号 ...
- IDEA2018创建SpringBoot无法连接https://start.spring.io
这是由于spring-boot需要访问https://start.spring.io外网,但是由于国内的局域网限制导致的. 解决办法: 进入到IDEA的setting 搜索 HTTP Proxy 选择 ...