AOJ_1155 How can I satisfy thee? Let me count the ways...
問題
解法
P,Q,Rの値の組み合わせの総数は3^3=27通りなのでそれぞれに対して、
真になるか判定する。
構文解析は初めてだったのでちょっとてこずった。
#include <cstdio> #include <algorithm> using namespace std; int P, Q, R; char f[81]; int p; int formula(){ int val1, val2, val; char c = f[p]; char op; p++; if(c == 'P') return P; else if(c == 'Q') return Q; else if(c == 'R') return R; else if('0' <= c && c <= '2'){ return c - '0'; }else if(c == '-'){ val = formula(); if(val == 0) val = 2; else if(val == 2) val = 0; return val; } val1 = formula(); op = f[p]; p++; val2 = formula(); p++; if(op == '*'){ if(val1 == val2 && val1 == 2){ val = 2; }else if(val1 == 0 || val2 == 0){ val = 0; }else{ val = 1; } } if(op == '+'){ if(val1 == val2 && val1 == 0){ val = 0; }else if(val1 == 2 || val2 == 2){ val = 2; }else{ val = 1; } } return val; } int main(){ char c; int sum; while(scanf("%s", f)){ if(f[0] == '.') break; scanf("%c", &c); sum = 0; for(P = 0; P < 3; P++){ for(Q = 0; Q < 3; Q++){ for(R = 0; R < 3; R++){ p = 0; if(formula() == 2) sum++; } } } printf("%d\n", sum); } return 0; }