注意的点是for (int j = 0; j < nums.size() && j != i; ++j)并不和for (int j = 0; j < nums.size(); ++j) if (i == j) continue; 等价 因为前者遇到j等于i就直接终止for循环了 并不会继续寻找j不等于i的元素。attention please!
#include <iostream> #include <vector> using namespace std; const double TARGET = 24; const double EPSILON = 1e-6; bool is_equal(double a, double b) { return abs(a - b) < EPSILON; } //递归尝试所有可能得的组合 bool dfs(vector<double>& nums) { if(nums.size() == 1) { return is_equal(nums[0], TARGET); } //遍历所有数字对 随着递归的深入 逐渐从四个运算数变成两个运算数得出结果 for(int i = 0; i < nums.size(); ++i) { for(int j = 0; j < nums.size(); ++j) { if(j == i) continue; vector<double> next_nums; //未被选中的数字被push进来 for(int k = 0; k < nums.size(); ++k) { if(k != i && k != j) next_nums.push_back(nums[k]); } //选中的两个进行运算之后也push进来 同时记得回溯 //加法 next_nums.push_back(nums[i] + nums[j]); if(dfs(next_nums)) return true; next_nums.pop_back(); //减法 next_nums.push_back(nums[i] - nums[j]); if(dfs(next_nums)) return true; next_nums.pop_back(); //乘法 next_nums.push_back(nums[i] * nums[j]); if(dfs(next_nums)) return true; next_nums.pop_back(); //除法 if(nums[j] != 0) { next_nums.push_back(nums[i] / nums[j]); if(dfs(next_nums)) return true; next_nums.pop_back(); } } } return false; } int main() { double num; vector<double> nums; while (cin >> num) { nums.push_back(num); } cout << (dfs(nums) ? "true" : "false") << endl; return 0; }