题目大意:
写一个程序判断输入的字母表是否具有“立即可解码性”。
什么是立即可解码性呢?
比如他给的两个例子
编码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;
}