算法竞赛入门经典(第二版) | 例题4-4 信息解码 (紫皮书牛啤!)(UVa213,Message Decoding)
大意:
二進制編碼中取前三位,得到編碼長度為n(0<=n<=7), 按此長度重復截取編碼中剩余部分(n位一截),直到讀取n個1結束。再次取三位,長度為n,重復上述操作…直至n個1后接000,文本結束。
本題輸出格式:若用回車分割出多行編碼, 則編一行,輸出一行。(注意英文原題)
題目(提交)鏈接→UVa-213
百度翻譯→百度翻譯
沒使用過該網站的同學請猛戳這里→vJudge教程
分析:
1、循環1:用readcodes()函數讀取編碼字符,存入二維數組,二維數組橫坐標為二進制位數,一位存第一行,二位存第二行… 形成表格。輸入EOF則退出。
2、循環2:用readint()函數獲取編碼長度,若長度為0則退出,不為0則進入循環2
3、循環3:用readint()函數按長度截取編碼,期間用readchar()函數跳過回車符,同時readint()函數將該二進制數轉化為十進制,
查表,輸出對應的字符,直至讀出n個1,返回循環1,重復…
還不是很明白的同學。把代碼中三段注釋消除,將所有函數的頭部標紅,自己調試一遍就明白了。
代碼:
#include <iostream> #include <cstdio> #include <cstring> using namespace std;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]; //將字符寫入這里 int readcodes() { //將所有字母按其二進制編碼順序存入code ,第一行存一位、二行存3(1<<len-1)位.. memset(code, 0, sizeof(code)); //清空數組(二維數組也可同樣清空) code[1][0] = readchar(); //直接調到下一行讀取,因為這一行只能有一個二進制數0(1表示結束) for(int len = 2; len <= 7; len++) {for(int i = 0; i < (1<<len)-1; i++) {int ch = getchar();if(ch == EOF) return 0;if(ch == '\n' || ch == '\r') return 1;code[len][i] = ch;}} return 1; } void printcodes() {for(int len = 1; len <= 7; len++) for(int i = 0; i < (1<<len)-1; i++) {if(code[len][i] == 0 ) return;printf("code[%d][%d] = %c\n", len, i, code[len][i]);} } int main() { while(readcodes()) { //無法讀取更多編碼頭時退出 // printcodes();for(;;) {int len = readint(3); //獲取接下來的編碼長度 if(len == 0) break; //如果為0,文本輸入結束 // printf("len=%d\n", len);for(;;) {int v = readint(len); //按長度決定取幾位 // printf("v=%d\n", v);if(v == (1 << len)-1) break; //如果v等于全為1的二進制數,則表示結束。 putchar(code[len][v]);}} putchar('\n');}return 0; }收獲:
1、\r是回車符,其中r是return的縮寫。回車符的作用是將當前位置移到本行的開頭。
2、二維數組的清空方法。
3、將所有函數的頭部都標紅,就可以在調試時進入(調試技巧)。
4、二進制的表示方法。注意: 一定是(1<<len)-1; 1<<len-1等價于1<<(len-1)
5、進制之間轉化函數(將文中2換成x。)
6、文件結束的判斷;‘000’結束的判斷;‘1’結束的判斷;三步層層遞進
7、紫皮書牛啤!我為紫皮書帶鹽!不接受反駁!
最后,分享一條大牛的建議(對筆者受益匪淺):平時在做題的時候,一定要尋找最優解,而不是 ac 了就不管了,應該多看看別人的解法。
超強干貨來襲 云風專訪:近40年碼齡,通宵達旦的技術人生總結
以上是生活随笔為你收集整理的算法竞赛入门经典(第二版) | 例题4-4 信息解码 (紫皮书牛啤!)(UVa213,Message Decoding)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 算法竞赛入门经典(第二版) | 例题4-
- 下一篇: 算法竞赛入门经典(第二版) | 例题4-