解法
最近構文解析にハマるワタクシ。
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 件のコメント:
コメントを投稿