布爾圓括號問題是要計算給定二進制表達式加括號的方法數,以便它的計算結果爲true。C++中的布爾括號
我根據給出的解釋here(small video explanation here)寫了一個C++解決方案,但它總是返回零。我的代碼看起來與第一頁上給出的代碼非常相似(在寫我的代碼之前我沒有看過),但它在我的地方沒有的地方有效。我犯了什麼錯誤?
#include <iostream>
#include <vector>
#include <map>
#include <queue>
#include <algorithm>
using namespace std;
int main() {
int n;
cin >> n;
vector<int> vals(n);
vector<int> ops(n - 1); //ops[n] is the operator
//between the nth and (n-1)th values
char tmp;
for(int i = 0; i < 2 * n - 1; ++i) {
if(i % 2 == 0) {
cin >> vals[i/2];
} else {
cin >> ops[i/2];
}
}
vector<vector<int> > t(n, vector<int>(n, 0)),
f(n, vector<int>(n, 0));
for(int i = 0; i < n; ++i) {
t[i][i] = vals[i] == 1;
f[i][i] = vals[i] == 0;
}
const int AND = 6, OR = 1, XOR = 4;
for(int i = 0; i < n - 2; ++i) {
for(int j = i + 1; j < n - 1; ++j) {
for(int k = i; k < j; ++k) {
cout << endl << i << " " << j << " " << k << endl;
switch(ops[k]) {
case AND:
t[i][j] = t[i][k] * t[k + 1][j]; //T & T = T
f[i][j] = f[i][k] * f[k + 1][j] //F & F = F
+ f[i][k] * t[k + 1][j] //F & T = F
+ t[i][k] * f[k + 1][j]; //T & F = F
case OR:
t[i][j] = t[i][k] * t[k + 1][j] //etc
+ f[i][k] * t[k + 1][j]
+ t[i][k] * f[k + 1][j];
f[i][j] = f[i][k] * f[k + 1][j];
case XOR:
t[i][j] = f[i][k] * t[k + 1][j]
+ t[i][k] * f[k + 1][j];
f[i][j] = f[i][k] * f[k + 1][j]
+ t[i][k] * t[k + 1][j];
}
for(int i = 0; i < n; ++i) {
for(int j = 0; j < n; ++j) {
cout << t[i][j] << " ";
}
cout << endl;
}
} //k loop
} //j loop
} //i loop
cout << endl << t[0][n - 1];
}
編譯所有警告和調試信息(例如'g ++ -Wall -Wextra -g')。學習如何**使用調試器**(例如'gdb') – 2014-12-06 06:38:12
是的,但我並沒有發現任何錯誤。 。 。在這種情況下,我可以用'gdb'做什麼? – 2014-12-06 06:39:23
用調試器可以做什麼:檢查過程的狀態,查詢變量和調用框架並逐步運行;想想你的計劃;明白什麼是錯的;改進你的程序;重新編譯;並重復,直到你滿意爲止。 – 2014-12-06 06:40:34