はまやんはまやんはまやん

hamayanhamayan's blog

真理関数をつくろう [yukicoder No.792]

https://yukicoder.me/problems/no/792

解説

https://yukicoder.me/submissions/319041

ルールが色々書いてあるが、主加法標準形を作れという問題。
情報学部出身なら学んでいる人も多いだろう。
 
あとは実装を頑張る。

int N;
int Q[20], R;
//---------------------------------------------------------------------------------------------------
void _main() {
    cin >> N;

    vector<string> buf;

    rep(_, 0, 1 << N) {
        rep(i, 0, N) cin >> Q[i];
        cin >> R;

        if (R == 1) {
            string expr = "";
            rep(i, 0, N) {
                if (i) expr += "∧";

                if (Q[i] == 0) expr += "¬P_" + to_string(i + 1);
                else expr += "P_" + to_string(i + 1);
            }
            buf.push_back(expr);
        }
    }

    if (buf.size() == 0) cout << "A=⊥" << endl;
    else if (buf.size() == (1 << N)) cout << "A=⊤" << endl;
    else {
        int n = buf.size();
        string ans = "A=";
        rep(i, 0, n) {
            if (i) ans += "∨";
            ans += "(" + buf[i] + ")";
        }
        cout << ans << endl;
    }
}