UVa 644 - Immediate Decodability

题目大意:


写一个程序判断输入的字母表是否具有“立即可解码性”。

什么是立即可解码性呢?

比如他给的两个例子


编码1:

A:01 B:10 C:0010 D:0000 

这个就具有立即可解码性,因为每个编码都具有唯一性,随便敲一串 001000000110100010 根据上面的编码可以把它对应的字母写出来是CDABBC

而下面这个编码就不具有立即可解码性

A:01 B:10 C:010 D:0000 

因为C:010 和A:01 在一个长串中是无法区分的

理解了这一点,程序就好写了。


下面是已AC的代码:

/**
 * Author: Gneveek
 * Data: 2011-10-3
 * Descripition:  UVa 644 - Immediate Decodability
 */ 
#include <stdio.h>
#include <string.h>
#define MAN_LINE 10
#define MAN_LEN 15
//这个数组是用来存放一个实例的,就是每个9之前的那堆0和1 
char alphabet[MAN_LINE][MAN_LEN];
int main()
{
	/* freopen("C:\\in.txt","r",stdin); */
	//这一堆的变量啊,汗
	//i是在存数据时当做每一行的行号的,数组的第一个下标
	//j,k,m是跑龙套的,用于for循环的计数 
	int i,j,k,m;
	char c; //c的用处就只有一个,见下面代码处	
	int flag; //flag用作标记一个实例是否是 immediately decodable
	int cas = 1;//这个就是case了,最后打印时的那个1,2,3......就是它 
	int litter;  //比较时两个对象里较小的一方 
	while(1)
	{
		i = 0;	
		while(1)
		{
			//这个while loop用来存数据,并判断是否该退出了 
			flag = 0;
			c = getchar();
			if(c == '9'){
				getchar(); //如果==9,先把它后面那个\n组清掉,再break; 
				break;
			}
			else if(c == EOF) //其实有了这货,下面那个return 0就被架空了, 
				return 0;     //咱们就遥尊其为太上吧,不删了 
			else 
				ungetc(c,stdin); //如果不是9也不是EOF,退还人家的字符 
			
			gets(alphabet[i++]);	//取一行 
		}
		for(j=0; j<i; j++)
		{
			for(k=j+1; k<i; k++)
			{
				litter = (strlen(alphabet[j]) < strlen(alphabet[k]))?
					strlen(alphabet[j]) : strlen(alphabet[k]);				
				for(m=0; m<litter; m++)
				{
					if(alphabet[j][m] != alphabet[k][m])
						break;	//j和k做为‘指针’,指向某两行,然后小m同学就指着每一行的某列,如果有不等就break 
				}
				if(m == litter)
				{
					flag = 1; 
					break;   //如果m == litter了,说明没被打断,意味着有奸情!马上break并处理他们(flag = 1) 
				}
			}
			if(flag == 1)   
				break;
		}
		if(!flag)  //好了,下面让我们来处理这对dog男女,败坏道德,拿命来! 
			printf("Set %d is immediately decodable\n",cas++);
		else
			printf("Set %d is not immediately decodable\n",cas++);
	}
	return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值