2011年6月7日火曜日

Aizu Online Judge 1155 How can I satisfy thee? Let me count the ways...

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

構文解析ゲー.変数への数の割り当て方は高々27通りなので,全部試せば良い.
  1. import java.util.*;  
  2. import java.lang.*;  
  3. import java.math.*;  
  4. import java.io.*;  
  5.   
  6. import static java.lang.Math.*;  
  7. import static java.util.Arrays.*;  
  8.   
  9. // AC  
  10. public class Main{  
  11.   
  12.  Scanner sc=new Scanner(System.in);  
  13.   
  14.  String s;  
  15.  int[] map;  
  16.   
  17.  void run(){  
  18.   for(;;){  
  19.    s=sc.next();  
  20.    if(s.equals(".")){  
  21.     break;  
  22.    }  
  23.    solve();  
  24.   }  
  25.  }  
  26.   
  27.  void solve(){  
  28.   map=new int[256];  
  29.   map['0']=0;  
  30.   map['1']=1;  
  31.   map['2']=2;  
  32.   int ans=0;  
  33.   for(int p=0; p<3; p++){  
  34.    for(int q=0; q<3; q++){  
  35.     for(int r=0; r<3; r++){  
  36.      map['P']=p;  
  37.      map['Q']=q;  
  38.      map['R']=r;  
  39.      Result res=f(0);  
  40.      if(res.value==2){  
  41.       ans++;  
  42.      }  
  43.     }  
  44.    }  
  45.   }  
  46.   println(ans+"");  
  47.  }  
  48.   
  49.  Result f(int p){  
  50.   // debug("f",p);  
  51.   if(Character.isDigit(s.charAt(p))||Character.isUpperCase(s.charAt(p))){  
  52.    return new Result(p+1, map[s.charAt(p)]);  
  53.   }else if(s.charAt(p)=='-'){  
  54.    Result r=f(p+1);  
  55.    r.value=2-r.value;  
  56.    return r;  
  57.   }else{  
  58.    Result r=f(p+1);  
  59.    Result r2=f(r.p+1); // skip '*' or '+'  
  60.    if(s.charAt(r.p)=='*'){  
  61.     r.value=min(r.value, r2.value);  
  62.    }else// '+'  
  63.     r.value=max(r.value, r2.value);  
  64.    }  
  65.    r.p=r2.p+1;  
  66.    return r;  
  67.   }  
  68.  }  
  69.   
  70.  class Result{  
  71.   int p, value;  
  72.   
  73.   Result(int p, int value){  
  74.    this.p=p;  
  75.    this.value=value;  
  76.   }  
  77.  }  
  78.   
  79.  void debug(Object... os){  
  80.   System.err.println(Arrays.deepToString(os));  
  81.  }  
  82.   
  83.  void print(String s){  
  84.   System.out.print(s);  
  85.  }  
  86.   
  87.  void println(String s){  
  88.   System.out.println(s);  
  89.  }  
  90.   
  91.  public static void main(String[] args){  
  92.   // System.setOut(new PrintStream(new BufferedOutputStream(System.out)));  
  93.   new Main().run();  
  94.  }  
  95. }  

0 件のコメント: