传送门: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;
		//在碰到换行符前,一直接收
	}
}