1. 程式人生 > >UVa 213 -- Message Decoding

UVa 213 -- Message Decoding

sci .... ems putchar size ascii碼 () Coding .net

Message Decoding

技術分享圖片

技術分享圖片

simple input

TNM AEIOU
0010101100011
1010001001110110011
11000

$#**\
0100000101101100011100101000

技術分享圖片

Message Decoding - UVALive 5152 - Virtual Judge

題意:

  給一個編碼頭和一串編碼(編碼可以換行),編碼頭根據以下規則對應編碼{ 考慮下面的01串: 0,00,01,10,000,001,010,101,110,0000,0001.....首先是長度為1的串,然後是長度為二的串,以此類推。並且每一段長度的數字從0到(1<<n)-1(第n段)排列,即題目中所說不包括全為1的串。

  編碼文本由多個小節組成,每小節前三位數字表示該小節中每個編碼的長度(例010表示編碼長度為2),然後是各個字符的編碼,每小節以全1結束。例第一小節:00101。

  你的任務是編寫一個解碼程序,將輸入的編碼轉化為對應編碼頭中字符的句子輸出。

  putchar(字符ASCII碼)輸出字符。

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int code[8][1<<8];
 4 int ans[1000];
 5 int readchar()
 6 {//處理換行符,並返回第一個合法字符的ascii
 7     char c = getchar();
 8     while(c==\n||c==\r)
 9     {
10         c = getchar();
11 } 12 return c; 13 } 14 int readcodes() 15 { 16 memset(code,0,sizeof(code)); 17 ///需要處理換行符,調用readchar進行處理,並返回第一個合法字符 18 code[1][0] = readchar();//讀取第一個不是換行符的字符, 19 //它的長度為1,編碼為0,即為數組的下標 20 //將其ascii存儲在code[1][0]中 21 if(code[1][0] == EOF)
22 return 0; 23 24 char c; 25 for(int j=2;j<=7;j++) 26 { 27 for(int k = 0;k<(1<<j)-1;k++) 28 { 29 c = getchar(); 30 if(c == EOF) return 0; 31 if(c == \n || c == \r) return 1; 32 code[j][k] = c; 33 } 34 } 35 return 1;//讀到EOF返回0,結束輸入,否則返回1繼續輸入編碼。 36 } 37 int readint(int len) 38 { 39 char c; 40 int sum = 0; 41 for(int i=0;i<len;i++) 42 { 43 c = readchar(); 44 sum = sum*2 + (c-0); 45 } 46 return sum; 47 } 48 int main() 49 { 50 while(readcodes())///讀取編碼頭,進行編碼 51 { 52 int ansLen = 0; 53 while(1) 54 { 55 int len = readint(3); 56 if(len == 0) break; 57 while(1) 58 { 59 int c = readint(len); 60 if(c == (1<<len)-1) break; 61 ///進行譯碼 62 ansLen++; 63 ans[ansLen] = code[len][c]; 64 } 65 } 66 for(int i=1;i<=ansLen;i++) 67 putchar(ans[i]); 68 putchar(\n); 69 } 70 return 0; 71 }

技術分享圖片

技術分享圖片

UVa 213 -- Message Decoding