1. 程式人生 > >UVa 213 Message Decoding (信息編碼)

UVa 213 Message Decoding (信息編碼)

== cout HA etc 換行符的處理 ostream flag 回歸 Coding

該題目作為放假回歸正軌的第一道正式做的題目,被卡了好久,唉,怪我有顆太浪的心

解題思路:

1、把編碼頭用二維字符數組存儲起來,a[x][y]存儲對應的字符,x表示編碼的長度,y表示編碼的大小,

存儲時註意y<2^x - 1的

2、由於編碼文本可能是由多行組成,所以需要判斷和跳過對換行符的處理,為方便處理,將編碼文本視作字符處理

#include<iostream>
#include<CString>
#include<cmath>
#include<stdlib.h>
using namespace std;
char a[8][64];
int get(int x) {//算出長度為x的編碼的值 char a; int s = 0; while (a = getchar()) { if (a != \n && a != \r) { x--; s += (int)(pow(2, x) * (a - 0)); if (x == 0) break; } } return s; } int main() { memset(a, 0, sizeof
(a)); for (int i = 1; i < 8; i++) {//將編碼頭存儲到二維字符數組中 int flags = 0; for (int j = 0; j < pow(2, i) - 1; j++) { char b = getchar(); if (b == \n || b == \r) { flags = 1; break; }
else a[i][j] = b; } if (flags == 1) break; } int L, S; while (true) { L = get(3);//小節中每個編碼的長度 if (L == 0) break;//000代表文本結束 while (true) {//對小節中的每個編碼進行解碼 S = get(L); if (S == pow(2, L) - 1) break; else cout << a[L][S]; } } cout << endl; system("pause"); }

UVa 213 Message Decoding (信息編碼)