読者です 読者をやめる 読者になる 読者になる

土下座しながら探索中

主に競技プログラミング

AOJ 2401: Equation

問題リンク : Equation | Aizu Online Judge

問題概要 :
与えられた等式が恒等式であるかどうかを判定しろ

使用した言語: C++

解法 :
与えられた真理値表の通り構文解析する。変数は11個しかないので全部試しても2の11乗(2048)しかないのでまさかの十一重ループを書いてみたりした。

コード :

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<stdexcept>
#include<cmath>
#include<memory>
#include<algorithm>
#include<cstring>
#include<ctime>
#include<deque>
#include<sstream>
#include<iomanip>
#include<sstream>
#include<vector>
#include<queue>
#include<stack>
#include<string>
#include<climits>
#include<map>
#include<set>
#include<list>
#include<cassert>
#include<deque>
#define REP(i,s,n) for(int i=s;i<n;i++)
#define rep(i,n) REP(i,0,n)
#define INF 1<<27
#define all(n) n.begin(),n.end()
#define insert(a,b,c,d) PP(P(a,b),P(c,d))
#define F first
#define S second
#define pb push_back
#define pf push_front
#define LIM 100000
using namespace std;
typedef pair<int,int> P;
typedef pair<P,P> PP;
typedef long long ll;
typedef unsigned long long ull;
 
 
class Parsing{
private:
  string parse;
  int pos;
  map<char,bool> val;
public:
 
  Parsing(string s,bool a,bool b,bool c,bool d,bool e,bool f,bool g,bool h,bool i,bool j,bool k){
    parse = s;
    pos = 0;
    val['a'] = a,val['b'] = b,val['c'] = c,val['d'] = d,val['e'] = e,val['f'] = f,val['g'] = g,val['h'] = h,val['i'] = i,val['j'] = j,val['k'] = k;
  }
 
  bool fact(){
    if(parse[pos] == '('){
      pos++;
      bool p = expression();
      pos++;
      return p;
    }else if(parse[pos] == '-'){
      pos++;
      bool p = fact();
     
      return p?false:true;
    }else{
      if('a' <= parse[pos] && parse[pos] <= 'k'){
    pos++;
    return val[parse[pos-1]];
      }      
      else if(parse[pos] == 'T' || parse[pos] == 'F'){
    ++pos;
    return parse[pos-1] == 'T'?1:0;
      }
      assert(false);
    }
  }
   
  bool term(){
    bool p = fact();
    
    return p;
  }
   
  bool expression(){
 
    bool p = term();
    
    while(parse[pos] == '+' || parse[pos] == '*' || parse.substr(pos,2) == "->" ){
      if(parse[pos] == '+'){
    pos++;
    bool q = term();
    p = p|q;
      }
      else if(parse[pos] == '*'){
    pos++;
    bool q = term();
    p = p&q;
      }
      else if(parse.substr(pos,2) == "->"){
    pos+=2;
    bool q = term();
    if(p && !q)p = false;
    else p = true;
        }
    }
    return p;
  } 
};
 
int main(){
 
  while(true){
    string s1,s2,s;
    cin >> s;
    if(s[0] == '#')break;
    for(int i=0;i<s.length();i++){
      if(s[i] == '='){
    s1 = s.substr(0,i);
    s2 = s.substr(i+1,s.length()-i-1);
    break;
      }
    }
    
    bool yes = true;
    rep(a,2){    
      rep(b,2){
    rep(c,2){
      rep(d,2){
        rep(e,2){
          rep(f,2){
        rep(g,2){
          rep(h,2){
            rep(i,2){
              rep(j,2){
            rep(k,2){
              Parsing par1(s1,a,b,c,d,e,f,g,h,i,j,k);
              Parsing par2(s2,a,b,c,d,e,f,g,h,i,j,k);
              if(par1.expression() != par2.expression() ){
                yes = false;
                break;
              }
            }
            if(!yes)break;
              }
              if(!yes)break;
            }
            if(!yes)break;
          }
          if(!yes)break;
        }
        if(!yes)break;
          }
          if(!yes)break;
        }
        if(!yes)break;
      }
      if(!yes)break;
    }
    if(!yes)break;
      }
      if(!yes)break;
    }
    yes?cout << "YES" << endl:cout << "NO" << endl;
  }
return 0;
}