問題文に
<formula> ::= 0 | 1 | 2 | P | Q | R |
-<formula> | (<formula>*<formula>) | (<formula>+<formula>)
とあったので一文字目にP Q Rはないと考えてcase文で一文字ずつ処理。
/****************************************************
* 2012/06/30 *
* AOJ Volume11 1155 *
* How can I satisfy thee? Let me count the ways... *
* crane *
*****************************************************/
/*------------------------------------------------------------------------*
<formula> ::= 0 | 1 | 2 | P | Q | R |
-<formula> | (<formula>*<formula>) | (<formula>+<formula>)
->一文字目にP Q Rはなし
*--------------------------------------------------------------------------*/
#include<iostream>
#include<string>
using namespace std;
#define MAX_L 80
string in;
int pos;
int Vp,Vq,Vr;
int formula();
int main(){
while(cin >> in){
if(in == ".") break;
int result = 0; //結果の初期化
for(int p=0; p<3; p++)
for(int q=0; q<3; q++)
for(int r=0; r<3; r++){
Vp=p; Vq=q; Vr=r;
pos = 0;
if(formula()==2) result++;
}
cout << result << endl;
}
return 0;
}
int formula(){
char c = in.at(pos); //一文字読む
pos++;
if(isdigit(c)) //数字なら数値を返す
return c-'0';
switch(c){
case 'P':
return Vp;
break;
case 'Q':
return Vq;
break;
case 'R':
return Vr;
break;
case '-':
return 2-formula();
break;
case '(':
int a = formula(); //()中の演算子左側
int tmp=0; //演算子用フラグ
if(in.at(pos) == '*')
tmp = 1;
pos++;
int b = formula(); //() 中の演算子右側
pos++; //)を飛ばすためpos++
/* * だった場合*/
if(tmp == 1){
return min(a, b);
}else{
/* + だった場合*/
return max(a, b);
}
break;
}
}
0 件のコメント:
コメントを投稿