問題概要
与えられた等式が,すべての場合において成り立つかどうか判定する。
定数: T, F
変数: a, b, c, d, e, f, g, h, i, j, k
論理否定: -X
論理積: (X*Y)
論理和: (X+Y)
論理包含: (X->Y)
解法
構文解析する。変数が最大11個なのですべての場合において試した。
ソース
#include<iostream> #include<string> #include<map> #include<sstream> #include<cctype> #include<algorithm> using namespace std; typedef string::const_iterator Cursol; bool ok; int bit; bool Formula(Cursol &c){ bool ret; if(*c == 'T') ret = true; else if(*c == 'F') ret = false; else if(islower(*c)) ret = bit >> ((*c) - 'a') & 1; else if(*c == '-') return !Formula(++c); else if(*c == '('){ ret = Formula(++c); if(*c == '+'){ ret |= Formula(++c); }else if(*c == '*'){ ret &= Formula(++c); }else if(*c == '-'){ //-> c++; ret = !ret | Formula(++c); } } c++; return ret; } int main(){ string s; Cursol c; while(cin >> s , ok = true, s != "#"){ string l = s.substr(0,s.find('=')); string r = s.substr(s.find('=')+1); for(bit = 0 ; bit < (1 << 11) ; bit++ ){ c = l.begin(); bool java = Formula(c); c = r.begin(); if( java != Formula(c) ){ ok = false; break; } } if(ok) cout << "YES" << endl; else cout << "NO" << endl; } }
0 件のコメント:
コメントを投稿