传送门:https://vjudge.net/problem/UVA-213
真的是感觉自己好垃圾,就这样的题竟然抠了一下午,最后发现导致程序错误的只是一对小括号,简直要抓狂了。。。
这道题的难度之一是输入的方式,需要自己设计一个read_code函数来接收多行输入,另一个需要解决的问题就是key和原字符的匹配,即设计match函数,要想一一对应,必须要唯一标识key值,这里可以用一个二维数组完美解决,key[digit_capacity][value] = char
另外要注意原字符串的输入可能包含空格,可以用上面的read_code函数来解决。
#include<stdio.h>
#include<string.h>
int match_code[8][129];
int read_char();
int read_code(int);
int get_code();
int main() {
memset(match_code, 0, sizeof(match_code));
while(read_char()) {
int value;
int len;
for(;;) {
len = read_code(3);
if(len == 0) break;
for(;;) {
value = read_code(len);
if(value == (1 << len) - 1) break;
printf("%c", match_code[len][value]);
}
}
printf("\n");
memset(match_code, 0, sizeof(match_code));
getchar();
//不加这个getchar(),最后一组总是输不出来结果
}
return 0;
}
int read_char() {
for(int i = 1; i < 8; i++)
for(int j = 0; j < (1 << i) - 1; j++) {
int ch = getchar();
if(ch == EOF) return 0;
if(ch == '\n' || ch == '\r') return 1;
match_code[i][j] = ch;
}
return 1;
}
int read_code(int c) {
int sum = 0;
while(c--) {
sum += (1 << c) * (get_code() - '0');
}
return sum;
}
int get_code() {
for(;;) {
int ch = getchar();
if(ch != '\n' && ch != '\r') return ch;
//在碰到换行符前,一直接收
}
}