問題:給出一些數目,能夠用加減乘除計算結果,求一些知足條件的結果。例如算24點。ios
簡化:生成+-*/的全部可能計算方式。(貌似不是數學中的排列,也不是數學中的組合)spa
求解:(非遞歸)回溯法。code
#include <iostream> using namespace std; // 0=>+, 1=>-, 2=>*, 3=>/ int op[100]; int count = 0; void output(int n) { for(int i = 0; i <= n-1; i++) { switch (op[i]) { case 0: cout << "+"; break; case 1: cout << "-"; break; case 2: cout << "*"; break; case 3: cout << "/"; break; default: cout << "error"; break; } } cout << endl; } void init(int n) { for(int i = 0; i < n; i++) { op[i] = -1; } } void back_tracking_2(int n) { init(n); int i = 0; while (i >-1) { if (i == n) { count++; output(n); i--; } // -1指示其狀態爲:未肯定。 // (0,1,2,3), 4 若有下一個解 if (op[i]+1 < 4) { op[i]++; // 嘗試下一個解 i++; // 前進,擴展分支 } else { op[i] = -1; // 重設分支的狀態爲未定 i--; // 回溯 } } } int main() { back_tracking_2(6); cout << count << " solutions found!" << endl; return 0; }