AOJ 1155 How can I satisfy thee? Let me count the ways...
http://rose.u-aizu.ac.jp/onlinejudge/ProblemSet/description.jsp?id=1155
構文解析する問題。
BNFが与えられているのでそれに従って書けばいい。
解析位置の移動に戸惑いました。
自分で書くのは楽しいけれどもあまり読み易くない感じのコード。
string in; int pos; int p,q,r; int formula(){ if(isdigit(in[pos])){ return in[pos++]-'0'; } switch(in[pos]){ case 'P':++pos; return p; case 'Q':++pos; return q; case 'R':++pos; return r; } if(in[pos]=='-'){ ++pos; return 2-formula(); } ++pos; int a=formula(); char cc=in[pos++]; int b=formula(); pos++; if(cc=='+'){ if(a==2 || b==2)return 2; if(!a && !b)return 0; return 1; } if(!a || !b)return 0; if(a==2 && b==2)return 2; return 1; } main(){ while(cin>>in){ if(in==".")break; int ans=0; for(p=0;p<3;p++)for(q=0;q<3;q++)for(r=0;r<3;r++){ pos=0; if(formula()==2)++ans; } cout<<ans<<endl; } }