3295:Tautology
概要
真偽値をもつ元が5つと、それぞれの組み合わせからなる論理式がある。論理式の値が真偽値の任意の組み合わせに対して1となるかどうかを判定する問題。
まずは式を構文解析する。あとは真偽の組み合わせ2^5全通り試すだけ。
char str[110]; int n; int tf[5]; int p; int eval(){ if(p==n) return -1; int a = str[p++]; switch(a){ case 'p': return tf[0]; case 'q': return tf[1]; case 'r': return tf[2]; case 's': return tf[3]; case 't': return tf[4]; case 'K': return K(); case 'A': return A(); case 'N': return N(); case 'C': return C(); case 'E': return E(); } return -1; } int K(){ int w = eval(), x = eval(); if(w==-1 || x==-1) return -1; return w*x; } int A(){ int w = eval(), x = eval(); if(w==-1 || x==-1) return -1; return (w+x)?1:0; } int N(){ int w = eval(); if(w==-1) return -1; return 1-w; } int C(){ int w = eval(), x = eval(); if(w==-1 || x==-1) return -1; return ((1-w)+x)?1:0; } int E(){ int w = eval(), x = eval(); if(w==-1 || x==-1) return -1; return (w==x)?1:0; } int main(){ int mask, i; while(scanf("%s\n",str)){ if(!strcmp(str,"0")) break; n = strlen(str); REP(mask,1<<5){ REP(i,5)tf[i] = (mask>>i)&1; p=0; if(!eval()) break; } puts((mask==1<<5)?"tautology":"not"); } }