#include <cstdio> #include <vector> #include <cassert> using namespace std; vector<vector<int>> klauzula; int n; vector<int> wartosciowanie; int check(int pos) { if (pos == n) { bool failed = false; for(int i = 0; i < klauzula.size(); i++) { bool ok = false; for(int j = 0; j < klauzula[i].size(); j++) { if (klauzula[i][j] < 0) { if (wartosciowanie[-klauzula[i][j]-1] == false) { ok = true; break; } } else { if (wartosciowanie[klauzula[i][j]-1] == true) { ok = true; break; } } } if (!ok) { failed = true; break; } } if (failed) return 0; return 1; } wartosciowanie[pos] = true; int r = check(pos+1); wartosciowanie[pos] = false; int l = check(pos+1); return r + l; } void read_f() { char c; int id; bool neg; klauzula.push_back(vector<int>(0)); scanf(" %c", &c); // ( while(c != ')') { scanf(" %c", &c); if (c == 'x') { neg = false; } else { assert(c == '~'); neg = true; scanf(" %*c"); // x } scanf("%d", &id); if (neg) id *= -1; klauzula.back().push_back(id); scanf(" %c", &c); // ) lub v } if (scanf(" %*c") == EOF) { // ^ return; } read_f(); } int main(){ scanf("%d", &n); read_f(); wartosciowanie.resize(n); printf("%d\n", check(0)); }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 | #include <cstdio> #include <vector> #include <cassert> using namespace std; vector<vector<int>> klauzula; int n; vector<int> wartosciowanie; int check(int pos) { if (pos == n) { bool failed = false; for(int i = 0; i < klauzula.size(); i++) { bool ok = false; for(int j = 0; j < klauzula[i].size(); j++) { if (klauzula[i][j] < 0) { if (wartosciowanie[-klauzula[i][j]-1] == false) { ok = true; break; } } else { if (wartosciowanie[klauzula[i][j]-1] == true) { ok = true; break; } } } if (!ok) { failed = true; break; } } if (failed) return 0; return 1; } wartosciowanie[pos] = true; int r = check(pos+1); wartosciowanie[pos] = false; int l = check(pos+1); return r + l; } void read_f() { char c; int id; bool neg; klauzula.push_back(vector<int>(0)); scanf(" %c", &c); // ( while(c != ')') { scanf(" %c", &c); if (c == 'x') { neg = false; } else { assert(c == '~'); neg = true; scanf(" %*c"); // x } scanf("%d", &id); if (neg) id *= -1; klauzula.back().push_back(id); scanf(" %c", &c); // ) lub v } if (scanf(" %*c") == EOF) { // ^ return; } read_f(); } int main(){ scanf("%d", &n); read_f(); wartosciowanie.resize(n); printf("%d\n", check(0)); } |