1155:How can I satisfy thee? Let me count the ways...

問題文
http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=1155&lang=jp



















構文解析やるだけ。

'-'→2-X
'*'→min(X,Y)
'+'→max(X,Y)

#include<iostream>
#include<algorithm>
#include<string>
#include<cctype>

#define rep(i,n) for((i)=0;(i)<(n);i++)

using namespace std;

int p,q,r,now;
string s;

int formula(void){
	
	if(isdigit(s[now])){return s[now++]-'0';}
	if(s[now]=='P'){now++;return p;}
	if(s[now]=='Q'){now++;return q;}
	if(s[now]=='R'){now++;return r;}
	
	int res=0;
	if(s[now]=='-'){now++;return 2-formula();}
	if(s[now]=='('){
		now++;
		res=formula();
		if(s[now]=='*'){now++;res=min(res,formula());}
		else if(s[now]=='+'){now++;res=max(res,formula());}
		now++;
	}
	return res;
}

int main(void){
	
	while(cin >> s,s!="."){
		
		int cnt=0;
		rep(p,3)rep(q,3)rep(r,3){
			now=0;
			if(formula()==2)cnt++;
		}
		cout << cnt << endl;
	}
	return 0;
}