2012年7月4日水曜日

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

問題文に
<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 件のコメント:

コメントを投稿