LeetCode 679. 24点游戏
思路
1 class Solution { 2 public: 3 bool judgePoint24(vector<int>& nums) { 4 vector<double> digits; 5 for (int num : nums) { 6 digits.push_back((double)num); 7 } 8 return backTracking(digits); 9 } 10 11 bool backTracking(vector<double> digits) { 12 int n = digits.size(); 13 if (n == 1) { 14 return abs(digits[0] - 24) < 0.001; 15 } 16 for (int i = 0; i < n - 1; i++) { 17 for (int j = i + 1; j < n; j++) { 18 vector<double> newDigits; 19 for (int k = 0; k < n; k++) { 20 if (k == i || k == j) continue; 21 newDigits.push_back(digits[k]); 22 } 23 // 标识变量isValid初始为 false,默认会执行||后面的递归。 24 // 一旦某个递归返回真,isValid就变为真,由于||的短路特性,后面的递归不会执行 25 bool valid = false; 26 // 加法 27 newDigits.push_back(digits[i] + digits[j]); 28 valid = valid || backTracking(newDigits); 29 newDigits.pop_back(); 30 // 减法 31 newDigits.push_back(digits[i] - digits[j]); 32 valid = valid || backTracking(newDigits); 33 newDigits.pop_back(); 34 newDigits.push_back(digits[j] - digits[i]); 35 valid = valid || backTracking(newDigits); 36 newDigits.pop_back(); 37 // 乘法 38 newDigits.push_back(digits[i] * digits[j]); 39 valid = valid || backTracking(newDigits); 40 newDigits.pop_back(); 41 // 除法 42 if (digits[j] != 0) { 43 newDigits.push_back(digits[i] / digits[j]); 44 valid = valid || backTracking(newDigits); 45 newDigits.pop_back(); 46 } 47 if (digits[i] != 0) { 48 newDigits.push_back(digits[j] / digits[i]); 49 valid = valid || backTracking(newDigits); 50 newDigits.pop_back(); 51 } 52 if (valid) return true; 53 } 54 } 55 return false; 56 } 57 };