#include #include #include #include FILE *f ; int nFrasi ; int sample = 1 ; typedef struct { int sogg, ogg, cont ; } frase ; frase *frasi = NULL ; enum { DIVINE=1, HUMAN, EVIL, LYING, DAY, NIGHT } ; frase leggiFrase() { frase x ; char str[256] ; int not = 0 ; fscanf(f," %s ",str) ; x.sogg = *str-'A'+1 ; fscanf(f," %s ",str) ; if ( !strcmp("It",str) ) { x.ogg = 0 ; /* It */ } else if ( !strcmp("I",str) ) { x.ogg = x.sogg ; } else x.ogg = *str-'A'+1 ; fscanf(f," %s ",str) ; /* is or am */ fscanf(f," %s ",str) ; if ( strcmp(str,"not")==0 ) { not = 1 ; fscanf(f," %s ",str) ; } if ( !strcmp("divine.",str) ) x.cont = DIVINE ; if ( !strcmp("human.",str) ) x.cont = HUMAN ; if ( !strcmp("evil.",str) ) x.cont = EVIL ; if ( !strcmp("lying.",str) ) x.cont = LYING ; if ( !strcmp("day.",str) ) x.cont = DAY ; if ( !strcmp("night.",str) ) x.cont = NIGHT ; if ( not ) x.cont = -x.cont ; return x ; } struct pp { int pers[6] ; int day ; struct pp *prev ; } *hd=NULL ; void verifica(int a,int b,int c,int d, int e, int day) { struct pp *tmp ; int w ; int vera ; int pers[6] , k; frase *f = frasi ; pers[1] = a ; pers[2] = b ; pers[3] = c ; pers[4] = d ; pers[5] = e ; for(w=0;wogg==0 ) { if ( f->ogg==DAY && !day ) vera = 0 ; if ( f->ogg==NIGHT && day ) vera = 0 ; } else { if ( f->cont == LYING ) if ( pers[f->ogg]==DIVINE || (pers[f->ogg]==HUMAN && day) ) vera = 0 ; else if ( f->cont == -LYING ) if ( pers[f->ogg]==EVIL || (pers[f->ogg]==HUMAN && !day) ) vera = 0 ; else { if ( f->cont>=0 ) if ( pers[f->ogg] != f->cont ) vera = 0 ; else if ( pers[f->ogg] == -f->cont ) vera = 0 ; } } if ( (pers[f->sogg]==DIVINE || (pers[f->sogg]==HUMAN && day)) && vera==0 ) return ; if ( (pers[f->sogg]==EVIL || (pers[f->sogg]==HUMAN && !day)) && vera ) return ; tmp = malloc(sizeof(*tmp)) ; tmp->prev = hd ; hd = tmp ; for(k=0;k<6;k++) tmp->pers[k] = pers[k] ; tmp->day = day ; } } void checkaTutto() { struct pp *pp ; int a,b,c,d,e,dn ; int fact=0 ; int pers , tipo ; for(a=1;a<=3;a++) for(b=1;b<=3;b++) for(c=1;c<=3;c++) for(d=1;d<=3;d++) for(e=1;e<=3;e++) for(dn=0;dn<2;dn++) { verifica(a,b,c,d,e,dn) ; } if (hd==NULL) { printf("This is impossible.\n\n") ; return ; } for(pers=1;pers<6;pers++) { tipo = hd->pers[pers] ; for(pp=hd;pp;pp=pp->prev) if ( pp->pers[pers] != tipo ) break ; if ( pp==NULL ) { fact = 1 ; switch (tipo) { case HUMAN: printf("%c is human.\n",pers-1+'A') ; break ; case EVIL: printf("%c is evil.\n",pers-1+'A') ; break ; case DIVINE: printf("%c is divine.\n",pers-1+'A') ; break ; } } } tipo = hd->day ; for(pp=hd;pp;pp=pp->prev) if ( pp->day != tipo ) break ; if ( pp==NULL ) { fact=1 ; printf("It is %s.\n", tipo ? "day":"night") ; } if (!fact) printf("No facts are deducible.\n\n") ; else printf("\n") ; } int main() { int a; f = fopen("island.in","r") ; for(;;) { fscanf(f," %d ",&nFrasi) ; if (nFrasi==0) break ; if ( frasi ) free(frasi) ; frasi = malloc( sizeof(frase) * nFrasi ) ; printf("Conversation #%d\n",sample++) ; for(a=0;a