解法
最近構文解析にハマるワタクシ。
AOJ1244 Molecular FormulaとかAOJ2401 恒等式とか以前ブログに取り上げたと思う。
三値論理の式が与えられてホゲってしまう。
なんか論理積とか論理和とか否定とか考えれば出来そうだけど、面倒臭かったのでテーブル作った。
ソース
#include<iostream> #include<string> #include<cctype> #include<algorithm> using namespace std; typedef string::const_iterator Cursol; int P, Q, R; int tmp1[3] = { 2, 1, 0}, tmp2[3][3] = {{0,0,0},{0,1,1},{0,1,2}}; int tmp3[3][3] = {{0,1,2},{1,1,2},{2,2,2}}; int formula(Cursol &c){ int ret ; if(*c == 'P') ret = P; else if(*c == 'Q') ret = Q; else if(*c == 'R') ret = R; else if(isdigit(*c)) ret = *c - '0'; else if(*c == '-') return tmp1[formula(++c)]; else if(*c == '('){ ret = formula(++c); if(*c == '*') ret = tmp2[ret][formula(++c)]; else if(*c == '+') ret = tmp3[ret][formula(++c)]; } c++; return ret; } int main(){ string s; Cursol c; while( cin >> s, s != "."){ int ret = 0; for(P = 0 ; P < 3 ; P++ ){ for(Q = 0 ; Q < 3 ; Q++ ){ for(R = 0 ; R < 3 ; R++ ){ c = s.begin(); if( 2 == formula(c)) ret++; } } } cout << ret << endl; } }
0 件のコメント:
コメントを投稿