#include #include char buf[100000][8]; char pr[60][10]; char* tc = "deh"; char* wc = "dn"; int npred; int check(char* buf) { int i; int pred; int lying[5]; int inh; int t; for (i = 0; i < 5; i++) { if (buf[i] == 'd') lying[i] = 0; else if (buf[i] == 'e') lying[i] = 1; else if (buf[i] == 'h') lying[i] = (buf[5] == 'n'); else return -1; } for (pred = 0; pred < npred; pred++) { inh = pr[pred][0] - 'A'; if (pr[pred][1] == 'w') t = (pr[pred][2] == buf[5]); else { if (pr[pred][3] == 'l') t = (lying[pr[pred][1] - 'A']); else t = (pr[pred][3] == buf[pr[pred][1] - 'A']); if (pr[pred][2] == '-') t = !t; } if (lying[inh]) t = !t; if (!t) return 0; } return 1; } int main(void) { int pred; FILE* f; char ibuf[500]; int w; char cur[10]; int cc[10]; int r; int i, ok; int prob = 1; f = fopen("island.in", "r"); while (1) { fgets(ibuf, sizeof(ibuf), f); npred = atoi(ibuf); if (npred == 0) return 0; for (pred = 0; pred < npred; pred++) { fgets(ibuf, sizeof(ibuf), f); pr[pred][0] = ibuf[0]; pr[pred][1] = 0; pr[pred][2] = 0; pr[pred][3] = 0; pr[pred][4] = 0; if (ibuf[3] == 'I') { if (ibuf[4] == 't') { pr[pred][1] = 'w'; pr[pred][2] = ibuf[9]; } else { pr[pred][1] = ibuf[0]; if (ibuf[8] == 'n') { pr[pred][2] = '-'; pr[pred][3] = ibuf[12]; } else { pr[pred][2] = '+'; pr[pred][3] = ibuf[8]; } } } else { pr[pred][1] = ibuf[3]; if (ibuf[8] == 'n') { pr[pred][2] = '-'; pr[pred][3] = ibuf[12]; } else { pr[pred][2] = '+'; pr[pred][3] = ibuf[8]; } } } /*-------------*/ ok = 0; for (cc[0] = 0; tc[cc[0]]; cc[0]++) { cur[0] = tc[cc[0]]; for (cc[1] = 0; tc[cc[1]]; cc[1]++) { cur[1] = tc[cc[1]]; for (cc[2] = 0; tc[cc[2]]; cc[2]++) { cur[2] = tc[cc[2]]; for (cc[3] = 0; tc[cc[3]]; cc[3]++) { cur[3] = tc[cc[3]]; for (cc[4] = 0; tc[cc[4]]; cc[4]++) { cur[4] = tc[cc[4]]; for (w = 0; wc[w]; w++) { cur[5] = wc[w]; cur[6] = '\0'; r = check(cur); if (r < 0) { printf("Error\n"); return -1; } if (r) { strcpy(buf[ok++], cur); } } } } } } } /*------------------*/ for (i = 0; i < 6; i++) cur[i] = '0'; cur[i] = 0; for (i = 0; i < ok; i++) { for (r = 0; r < 6; r++) { if (cur[r] == '0') cur[r] = buf[i][r]; else { if (buf[i][r] != cur[r]) cur[r] = '-'; } } } /*------------------*/ printf("Conversation #%d\n", prob++); if (!strcmp(cur, "000000")) printf("This is impossible.\n"); else if (!strcmp(cur, "------")) printf("No facts are deducible.\n"); else { for (r = 0; r < 5; r++) { if ((cur[r] != '0') && cur[r] != '-') printf("%c is %s.\n", r + 'A', cur[r] == 'd' ? "divine" : cur[r] == 'e' ? "evil" : "human"); } if ((cur[5] != '0') && cur[5] != '-') printf("It is %s.\n", cur[5] == 'd' ? "day" : "night"); } printf("\n"); } }