例题 4-4 信息解码

版权声明:本人菜鸟一只,如文章有错误或您有高见,请不吝赐教 https://blog.csdn.net/qq_41138935/article/details/82860987

题解:

A,B,#,T,A,N

相对应:

0,00,01,10,000,001,010,011,100,101,110,0000,0001.........1101,1110,00000,..........

例如:

编码头 $ # * * \
01串 0 00 01 10 000
code[len,value]表示 [1,0] [2,0] [2,1] [2,2] [3,0]

解码:010(长度为2)  00(#) 00(#) 10(*) 11(小结结束) 011(长度为3) 000(\) 111(小结结束) 001(长度为1) 0($) 1(小结结束) 000(结束)

#include<iostream>
#include<cstring>
using namespace std;
int code[8][1<<8];
int readchar(){
	for(;;){
		int ch=getchar();
		if(ch!='\n'&&ch!='\r'){
			return ch;
		}
		
	}
}
int readcodes(){
	memset(code,0,sizeof(code));	//清空数组
	code[1][0]=readchar();
	for(int len=2;len<=7;len++){
		for(int i=0;i<(1<<len)-1;i++){
			int ch=getchar();
			if(ch==EOF) return 0;
			if(ch=='\n'||ch=='\r') return 1;
			code[len][i]=ch;
			cout<<len<<","<<i<<code[len][i]<<endl;	
		} 
	}
	return 1;
}

int readint(int c){
	int v=0;
	while(c--){
		v=v*2+readchar()-'0';
	}
	return v;
}

int main(){
	while(readcodes()){		//无法读取更多编码头时退出
	 //printcodes();
	for(;;){
		int len=readint(3);
		if(len==0){
			break;
		printf("len=%d\n",len);
		}
		for(;;){
			int v=readint(len);
		//printf("v=%d\n",v);
			if(v==(1<<len)-1) break;
			putchar(code[len][v]);
		}
	}
		putchar('\n');
	}
	
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_41138935/article/details/82860987