回溯法(非递归实现)
问题:给出一些数目,可以用加减乘除计算结果,求一些满足条件的结果。例如算24点。
简化:生成+-*/的所有可能计算方式。(貌似不是数学中的排列,也不是数学中的组合)
求解:(非递归)回溯法。
#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; }