http://en.wikipedia.org/wiki/Backtrackingios
回溯法:基於記憶。在某個點(回溯點),前進試探一種的方案,而後再回退到這個點,前進試探下一種方案。spa
問題:給出一些數目,能夠用加減乘除計算結果,求一些知足條件的結果。例如算24點。code
簡化:生成+-*/的全部可能計算方式。(貌似不是數學中的排列,也不是數學中的組合)blog
求解:(遞歸實現的)回溯法。遞歸
#include <iostream> using namespace std; // 0=>+, 1=>-, 2=>*, 3=>/ int op[100]; 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; } int count = 0; void back_tracking(int i, int n) { if (i == n ) { output(n); count++; } else { for(int k = 0; k <= 3; k++) { op[i] = k; // 回溯點, 意味着:取消op[i]的上一個值,從新設置op[i]新值,而後前進。 back_tracking(i+1,n); // op[i] = -1; } } } int main() { back_tracking(0,6); cout << count << " solutions found!" << endl; return 0; }