UVA-213-Message Decoding 資訊編碼 基礎模擬題 直觀的新手思路+詳細註釋
阿新 • • 發佈:2019-02-17
題意:
1. 首先輸入編碼頭,即一串字串
2. 接下來時只有0和1的串,要求就是對串進行操作然後輸出對應的編碼串
3. 每次編碼先用三個字元計算二進位制和判斷接下來的串時多少個字元為一個編碼
4. 每次編碼遇到全為1的時候結束進行下一次串長判斷(即重複3),直到串長判斷為0時結束本次編碼
5. 根據二進位制規則對編碼頭進行一一對應
6. 0對應1,00對應2,01對應3,10對應4,(不存在全為1的串,全為1的串表示結束),000對應5,001對應6,……
7. 由於二進位制111=7,所以經過計算這個編碼頭最長也就247個字元,開個300的陣列足矣
8. PS:01串中隨機出現的回車不納入字元判斷(即需要跳過)
思路:
1. 先用三個字元判斷接下來的編碼串長sum
2. 然後利用sum判斷前置有多少位數flag
3. 接下來對sum長度的串進行二進位制和計算出num
4. flag+num就是對應的編碼字元的下標
5. 遇到sum=0時結束本次編碼,並等待下一個編碼頭的輸入
6. 每次編碼結束要記得清空緩衝區,不然會影響下一次的編碼
我的AC程式碼如下:
#include <iostream> #include <cstdio> #include <cmath> using namespace std; char s[300]; int main() { //freopen("input.txt","r",stdin); char ch; int sum,flag,q,num; while(gets(s)) { while(1) { //測待用長度 sum=0; for(int i=2; i>=0; i--) { ch=getchar(); if(ch=='\n') //跳過回車 i++; else if(ch=='1') sum+=pow(2,i); } //如果長度為0,再見 if(sum==0) break; //處理前置位置 else if(sum==1) flag=0; else if(sum==2) flag=1; else if(sum==3) flag=4; else if(sum==4) flag=11; else if(sum==5) flag=26; else if(sum==6) flag=57; else if(sum==7) flag=120; q=pow(2,sum)-1; //這裡開始迴圈輸出對應長度代表的字元 //直到全為1時結束進入下一次編碼判斷 while(1) { num=0; for(int i=sum-1; i>=0; i--) { ch=getchar(); //輸入字元 if(ch=='\n') //跳過回車 i++; else if(ch=='1') num+=pow(2,i); } //當長度sum的串全為1時結束 if(num==q) break; //按位置輸出字元 else printf("%c",s[flag+num]); } } printf("\n"); //吃光緩衝區,為下一次的編碼頭輸入做清空操作 while((ch = getchar()) != '\n' && ch != EOF); } return 0; }