2014年9月19日星期五

[Uva] 644 - Immediate Decodability


#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h> 
char codes[12][12]={'\0'};
int main(){
  
  freopen("input.txt", "r", stdin);


  int a=0;
  int set=1;
  int decodable[12]={0}; //儲存每一record和前面所有record比較,找不到字首相同,則為可編碼
  while(scanf("%s",codes[a])!=EOF){
    
 decodable[0]=1; //第一個record因為只能和自己比,故先設為1
 if(codes[a][0]!='9'){
  for(int i=0;i<a;i++){ 
    if(a==0){  //若為第一個狀況,則先跳出
     break;
    }
    int flag=0;
    while(1){
     //printf("%c %c\n",codes[i][flag],codes[a][flag]);
     if(codes[a][flag]==codes[i][flag]){  //若檢查為相同的字
    flag++; //旗標往下一位元跳
    decodable[a]=0; //暫定此record的可編碼為0 
     }
     //若其中一項record的下一字元為'\0'且可編碼依然為0,則跳出
     if((codes[a][flag]=='\0'||codes[i][flag]=='\0') && decodable[a]==0)
    break;
     //若在兩項record都還沒到'\0',且發現兩位元不同,則為可編碼
     if(codes[a][flag]!=codes[i][flag]&&codes[i][flag]!='\0'&&codes[a][flag]!='\0'){
    decodable[a]=1;
    break;
     }
    }
    if(decodable[a]==0)break;
  }
 }
 
 
 
 if(codes[a][0]=='9'){
   for(int i=0;i<a;i++){
     if(decodable[i]==0){ //若發現其中一項為0,則為不可編碼
    printf("Set %d is not immediately decodable\n",set);
    a=-1;
    break;
  }
  if(i==(a-1) && decodable[i]==1){ //若i已經到了第a-1項且依然為1
    a=-1;
    printf("Set %d is immediately decodable\n",set);
  }
   }
   set++;
   memset(decodable,0,sizeof(int)); //初始化
    }
 a++;
  }   

  
  return 0;
} 

沒有留言: