一:题目

  1. 消息编码方案要求在两个部分中发送一个被编码的消息。第一部分:称为头,包含消息的字符。第二部分包含一个模式
  2. 表示信息。你必须写一个程序,可以解码这个消息。

(一)题目详细

  1. 你的程序的编码方案的核心是一个序列的“01”的字符串
  2.  
  3. , , , , , , , , , , , , , . . . , , , , . . .(对应数字个数n,则表示的编码为2^n-1个)
  4.  
  5. 序列中长度为11个,长度为23个,长度为37个,长度为415个。如果相邻两个具有相同的长度,第二可从第一个加12进制)。注意有序列中没有全都是1的串。
  6.  
  7. 键被映射到标题中的字符。也就是说,第一个键()映射在标题的第一个字符,第二键()在头的二字符,k键映射到标头中的k个字符。

(二)案例

  1. 例如,假设标题是:AB#TANCnrtXc  (可以包含空格)
  2.  
  3. 然后0映射到A00映射到B01映射到#,10映射到T000映射到A,…,110映射到X0000映射到c.
  4.  
  5. 该编码的信息包含01的和可能的回车,这是被忽略。消息分为段。一个段的前3位数字为二进制表示在段的键的长度。例如,如果前3位数字为010,则其余该段由长度为2(,,或10)。段的结束是1的字符串
  6. 在段中的键长度相同。因此一段长度2的键是终止11。整个编码的信息被000终止(这将意味着一段段其中的按键有0个)。通过将该段中的键进行翻译,该消息被解码的标题字符已被映射。

(三)输入

  1. 输入文件包含多个数据集。
    每个数据集包含一个标题,这是在一个单独的行就其本身而言,和一个消息,它可能会延续几行。
    头的长度(由三个数据位表示,0-7--->最大长度为七)是有限的唯一的事实,有一个关键字符串的最大长度为7111的二进制)。--->(由于最大长度为7,所以所表示的最大编码数为2^7-1
    如果有多个在头一个字符的副本,然后几个键将映射到字符。
    编码信息仅包含01的,这是一个合法的编码,根据所描述的计划。那是,信息段的开始与适当的序列的序列长度和位数1,在任何给定的段的键都是相同的长度,并且它们都对应于字符标题。
    该消息以000终止
  1. TNM AEIOU
  2.  
  3. 1010001001110110011    //允许换行
  4. 11000  //这才是结束
  5. $#**\
  6. 0100000101101100011100101000  //结束

(四)输出

  1. TAN ME
  2.  
  3. ##*\$

二:代码实现

  1. //信息解码,所有信息都属于ASCII码中
  2. void Save_Encode(char Code_Header[MAX_LEN],char Encode[][],int CHT_Status)
  3. {
  4. //开始向编码中存放数据
  5. //获取编码头--注意含有空格
  6.  
  7. int ch,i=;
  8. if (!CHT_Status) //编码头没有获取
  9. while ()
  10. {
  11. ch = getchar();
  12. Code_Header[i++] = ch;
  13. if (ch == '\n'||ch==EOF)
  14. break;
  15. }
  16.  
  17. //将编码头数据放入编码中--最重要
  18. int p,k = ;
  19. for (i = ; i <= ; i++)
  20. {
  21. p = pow(2.0, i*1.0) - ;
  22. for (int j = ; j < p; j++)
  23. if (Code_Header[k] != '\n')
  24. Encode[i][j] = Code_Header[k++];
  25. else
  26. return;
  27. }
  28. }
  1. //获取编码文本到Code_Text
    int Save_CodeText(char Code_Text[MAX_LEN], char Code_Header_Temp[MAX_LEN])
  2. {
  3. int ch, i;
  4.  
  5. while ()
  6. {
  7. memset(Code_Header_Temp, , sizeof(Code_Header_Temp));
  8. //获取一行到Code_Header_Temp
  9. i = ;
  10. while ()
  11. {
  12. ch = getchar();
  13. Code_Header_Temp[i++] = ch==EOF?'\n':ch;
  14. if (ch == '\n'||ch==EOF)
  15. break;
  16. }
  17. if (Code_Header_Temp[] != '' && Code_Header_Temp[] != '')
  18. return ;
  19. //将临时数据连接到Code_Text中
  20. if (strlen(Code_Text)>)
  21. Code_Text[strlen(Code_Text)-] = ;
  22. strcat(Code_Text, Code_Header_Temp);
  23. }
  24. return ;
  25. }
  1. //获取指定个数二进制文本的数值
  2. int getVal(char* codeText,int n)
  3. {
  4. int val = ;
  5. for (int i = n - ; i >= ;i--)
  6. {
  7. int k = ;
  8. for (int j = ; j <= i; j++)
  9. {
  10. k *= ;
  11. }
  12. val += (*codeText-'')*k;
  13. codeText++;
  14. }
  15. return val;
  16. }
  1. //处理数据,进行输出
    void Deal_CodeData(char Encode[][], char* Code_Text)
  2. {
  3. int len,val,chk,k=;
  4.  
  5. while ()
  6. {
  7. //找到编码长度
  8. len = getVal(&Code_Text[k], );
  9. Code_Text += ; //步长向后移动3个
  10.  
  11. if (len == ) //3个0退出
  12. return;
  13.  
  14. chk = pow(2.0, len*1.0) - ;
  15. //根据长度,获取值
  16. while ()
  17. {
  18. val = getVal(Code_Text, len);
  19. Code_Text += len;
  20. if (val == chk)
  21. break;
  22.  
  23. //去对应位置找编码数据
  24. printf("%c", Encode[len][val]);
  25. }
  26. }
  27. }
  1. void func03()
  2. {
  3. FILE* fi = freopen("data.in", "r", stdin);
  4. freopen("data.out", "w", stdout);
  5.  
  6. //因为前三位表示长度,所以最长为7位其中七位编码最大为1111110可以表示2^7-1个数所以将列数设置为2^7=128
  7. char Encode[][]; //操作二维数组,我们直接从1开始,忽略0带来的麻烦
  8. //注意:每行只有2^n - 1 个有效
  9.  
  10. char Code_Header[MAX_LEN]; //存放编码头
  11. char Code_Text[MAX_LEN]; //存放编码文本
  12.  
  13. char Code_Header_Temp[MAX_LEN]; //存放有可能的编码头
  14.  
  15. int CHT_Status=; //是否从临时数组中读取编码头
  16.  
  17. memset(Code_Header_Temp, , sizeof(Code_Header_Temp));
  18.  
  19. //开始进行读取处理数据
  20. while (!feof(fi))
  21. {
  22. memset(Code_Text, , sizeof(Code_Text));
  23. memset(Encode, , sizeof(Encode));
  24. memset(Code_Header, , sizeof(Code_Header));
  25.  
  26. //将编码头数据保存到编码数组中
  27. if (CHT_Status)
  28. strcpy(Code_Header, Code_Header_Temp);
  29.  
  30. Save_Encode(Code_Header, Encode,CHT_Status);
  31.  
  32. //获取编码文本--文本可能不在同一行(难点)
  33. //方法:一次获取一个字符
  34. CHT_Status = Save_CodeText(Code_Text,Code_Header_Temp);
  35.  
  36. //开始处理数据,并打印出来
  37. Deal_CodeData(Encode,Code_Text);
  38. printf("\n");
  39. }
  40.  
  41. freopen("CON", "r", stdin);
  42. freopen("CON", "w", stdout);
  43. }

算法习题---4.4信息解码(UVa213)的更多相关文章

  1. 把vux中的@font-face为base64格式的字体信息解码成可用的字体文件

    在最近移动端项目中用到了vux,感觉用着还习惯,当把vux使用到PC端的时候出现了IE浏览器出现,这样的错误信息: CSS3114: @font-face 未能完成 OpenType 嵌入权限检查.权 ...

  2. 【算法习题】数组中任意2个(3个)数的和为sum的组合

    题1.给定一个int数组,一个数sum,求数组中和为sum的任意2个数的组合 @Test public void test_find2() { int[] arr = { -1, 0, 2, 3, 4 ...

  3. 4_4 信息解码(UVa213)<二进制:输入技巧与调试技巧>

    消息编码方案要求在两个部分中发送一个被编码的消息.第一部分:称为头,包含消息的字符.第二部分包含一个模式 表示信息.你必须写一个程序,可以解码这个消息. 你的程序的编码方案的核心是一个序列的“0和1” ...

  4. UVA213 信息解码

    对于lrj的想法,真是太清晰.自己真的是很难去做到.贴此代码,加以练习,加以感悟. #include<cstdio> #include<cstring> ][<<] ...

  5. UVA 213 信息解码(二进制&位运算)

    题意: 出自刘汝佳算法竞赛入门经典第四章. 考虑下面的01串序列: 0, 00, 01, 10, 000, 001, 010, 011, 100, 101, 110, 0000, 0001, …, 1 ...

  6. July 算法习题 - 字符串4(全排列和全组合)

    https://segmentfault.com/a/1190000002710424 思想:当前层各节点首元素不同,则各节点的剩余元素也不同:下一层节点交换范围为首元素以外的元素 全排列算法: vo ...

  7. 算法习题---5-8图书管理系统*****<双向迭代器>(UVa230)

    一:题目 就是输入一系列书本名和作者名,然后输入命令模拟借书和还书,再输出归还的书的摆放位置.要求有两点: 需要对归还的书做特殊排序处理:作者名相同,则书本按书名从小到大排序:否则书本按作者名大小排序 ...

  8. 算法习题---5-7打印队列(UVa12100)

    一:题目 有一个打印机,有一些任务在排着队打印,每个任务都有优先级.打印时,每次取出队列第一个任务,如果它的优先级不是当前队列中最高的,就会被放到队尾,否则就打印出来.输出初始队列的第m个任务的打印时 ...

  9. 算法习题---5-6对称轴(UVa1595)

    一:题目 判断平面上的一组点,是否关于一条竖线对称.即找到一条垂直对称轴 (一)样例输入 - (二)样例输出 YES NO YES 二:代码实现 #define _CRT_SECURE_NO_WARN ...

随机推荐

  1. Winform工程反编译后的工作

    Winform工程,反编译后,虽然能用,但不太好用. 因为form并没有像原生的那样. 所以,需要几个步聚: 1. 用ResGen工具,把二进制资源文件还原为xml格式: ResGen fromXX. ...

  2. linux下环境管理anaconda3

    我之前在centos之安装单独python3.6,大家都知道centos自带python2.7,通过输入python,和python3来控制想要使用python2,或者python3,如今想要要在li ...

  3. Spring Boot 项目在 IntelliJ IDEA 中配置 DevTools 实现热部署(macOS 系统)

    要配置的内容: 1.Preference -> Build, Execution, Deployment -> Complier -> Build project automatic ...

  4. machine learning(9) -- classification:Decision boundary

    machine learning(9) -- classification:Decision boundary 上图的decision boundary是一条直线,是属于预测函数的一个属性(当参数已经 ...

  5. Jquery 操作DOM元素

    一.文本输入框: text <input type=”text” value=”99.com” size=12 id=”input1” /> 1.获取文本值: $("#input ...

  6. Selenium常用API的使用java语言之18-浏览器cookie操作

    有时候我们需要验证浏览器中Cookie是否正确, 因为基于真实Cookie的测试是无法通过白盒测试和集成测试进行的.WebDriver提供了操作Cookie的相关方法可以读取. 添加和删除Cookie ...

  7. AtCoder NIKKEI Programming Contest 2019 C. Different Strokes (贪心)

    题目链接:https://nikkei2019-qual.contest.atcoder.jp/tasks/nikkei2019_qual_C 题意:给出 n 种食物,Takahashi 吃下获得 a ...

  8. IntelliJ IDEA使用教程一 介绍&安装&配置

    http://blog.csdn.net/nextyu/article/details/47206015 全套

  9. Spring 对事务的整合

    对事务的复习 什么是事务: 事务(TRANSACTION) 是作为单个逻辑工作单元执行的一系列操作. 多个操作作为一个整体向系统提交,要么都执行,要么都不执行. 事务是一个不可分割的逻辑单元. 事务的 ...

  10. Postgresql vacuum freeze相关参数

    先看3个参数:autovacuum_freeze_max_age           | 500000vacuum_freeze_min_age               | 10vacuum_fr ...