poj1056解题报告

//poj1056 immediate decodablity
//AC of gcc
#include <stdio.h>
#include <string.h>

#define SIZE 2000
#define MAX_BIT_NUM 20
#define MAX_LINES 20

//bool is not supported by GCC
#define bool int
#define true 1
#define false 0


typedef struct input_string 
{
	char data[MAX_BIT_NUM];
	int length;
}input_string;

void insert_sort(input_string is[],int lines)
{
	int i,j;
	input_string temp;
	for (i=1;i<lines;i++)
	{
		temp = is[i];
		for (j=i-1;j>=0,temp.length<is[j].length;j--)
			is[j+1] = is[j];
		is[j+1] = temp; 
	}
}

int main()
{
	bool is_decodable;
	int i,j,lines = 0,set_num = 0;
	char in_line[11];

	bool flag[SIZE];
	for (i=0;i<SIZE;i++)
		flag[i] = false;

	input_string is[MAX_LINES];

	while(scanf("%s",in_line)!=EOF)
	{
		is_decodable = true;
		if (0==strcmp("9",in_line))
		{
			set_num++;
			insert_sort(is,lines);

			for (i=0;i<lines && is_decodable;i++)//遍历组内各行数据
			{
				int index_flag = 1;//编码对应的数组下标
				for (j=0;j<is[i].length;j++)//计算本行编码对应的数组下标并判断是否符合前缀编码
				{
					index_flag = (index_flag << 1)+(is[i].data[j]-'0');
					if (flag[index_flag])//当前前缀index_flag已经被占用,无法形成前缀编码
					{
						is_decodable = false;
						break;
					}
				}
				//检验本行是否通过前缀编码测试
				if (is_decodable)
				{
					flag[index_flag] = true;//记录本行编码在flag数组中对应的位置
				}
			}

			if (is_decodable)//本组所有行是否满足前缀编码规则
				printf("Set %d is immediately decodable\n",set_num);
			else
				printf("Set %d is not immediately decodable\n",set_num);

			lines = 0;
			for (i=0;i<SIZE;i++)
				flag[i] = false;
		}
		else
		{
			strcpy(is[lines].data,in_line);
			is[lines].length = strlen(in_line);
			lines++;
		}
	}

	return 0;
}

 

posted @ 2013-06-02 23:41  xiaowenchao  阅读(231)  评论(0编辑  收藏  举报