#include // #include // #include // #include #include #define fail {assert(0);} int anz=1000000,num=1,auss; FILE *fin; const maxhm=6; const maxstat=60; const anxhm=5; const human=0,evil=1,divine=2,lying=3; typedef struct { int type; // 0:daynight, 1: ... is ... int neg; // 1 when negated int night; // 1 when It is night; int p1; // aussagender int p2; // ueber ... int pt; // state of p2 } Tauss; int modl[maxhm][3]; // modelle humans int modnght[2]; // modell night int state[maxhm]; int night; Tauss A[maxstat]; int naus; // nummer Aussage int Xor(int a,int b) { return ((a&&!b)||(!a&&b)); } int checka(int a) { // check aussage a Tauss *aa; aa=A[a]; int ly; // if person is lying. if(state[aa->p1]==divine) ly=0; if(state[aa->p1]==evil) ly=1; if(state[aa->p1]==human) ly=night; ly=Xor(ly,aa->neg); if(aa->type==0){ return !Xor(Xor(ly,night),aa->night); } else { return Xor(ly, state[aa->p2]==aa->pt ); } } void checkall() { // check all auss int i; for(i=0;ineg=0; aa->p1=int(s[0]-'A'); fscanf(fin,"%s",s); if(strcmp(s,"It")==0){ aa->type=0; fscanf(fin,"%s",s); fscanf(fin,"%s",s); if(strcmp(s,"day.")==0) aa->night=0; else aa->night=1; return; } if(s[0]=='I') { aa->p2=aa->p1; fscanf(fin,"%s",s); } else { aa->p2=int(s[0]-'A'); fscanf(fin,"%s",s); } fscanf(fin,"%s",s); if(strcmp(s,"not")==0) { aa->neg=1; fscanf(fin,"%s",s); } else aa->neg=0; switch(s[0]) { case 'd': aa->pt=divine; break; case 'h': aa->pt=human; break; case 'e': aa->pt=evil; break; case 'l': aa->pt=lying; break; } } void persons(int p){ if(p>5) checkall(); state[p]=human; persons(p+1); state[p]=evil; persons(p+1); state[p]=divine; persons(p+1); } void dostates(){ night=0; persons(0); night=1; persons(0); } void printout(){ int flag,p; flag=0; if( !(modnght[0]||modnght[1]) ) { printf("This is impossible.\n"); return; } for(p=0;p<5;p++){ if(modl[p][human]&&modl[p][divine]&&modl[p][evil]) continue; if(modl[p][human]) printf("%c is human.\n",p+'A'); if(modl[p][evil]) printf("%c is evil.\n",p+'A'); if(modl[p][divine]) printf("%c is divine.\n",p+'A'); flag=1; } if(Xor(modnght[0],modnght[1])) { if(modngth[1]) printf("It is night.\n"); else printf("It is day.\n"); }; if(!flag) printf("No facts are deducible.\n"); } int main() { int i,flag; fin=fopen("island.in","r"); assert(fin); for(num=1; num<=anz; num++){ fscanf(fin,"%d",&auss); if(auss==0) break; printf("Conversation #%d\n",num); naus=0; for(i=0;i