以nums[4] = {4, 1, 7, 8}爲例。
利用DFS先算一輪加法:
bool dfs(double* nums, int numsSize) {
printf("%.1f ", nums[0]);
if(numsSize == 1) {
if(fabs(nums[0]-24)<1e-2) return true;
else return false;
}
double a,b;
for(int i = 0; i < numsSize; i++) {
for(int j = i+1; j < numsSize; j++) {
a = nums[i];
b = nums[j];
nums[j] = nums[numsSize-1];
nums[i] = a+b;
if(dfs(nums, numsSize-1)) return true;
nums[i] = a-b;
if(dfs(nums, numsSize-1)) return true;
nums[i] = b-a;
if(dfs(nums, numsSize-1)) return true;
nums[i] = a*b;
if(dfs(nums, numsSize-1)) return true;
//除法分母不爲0
if(b != 0) nums[i] = a/b;
if(dfs(nums, numsSize-1)) return true;
if(a != 0) nums[i] = b/a;
if(dfs(nums, numsSize-1)) return true;
//回溯
nums[i]=a;
nums[j]=b;
}
}
return false;
}
bool judgePoint24(int* nums, int numsSize) {
double nums2double[numsSize]; // 保證除法是小數除法
for(int i = 0; i < numsSize; i++) {
nums2double[i] = *(nums+i);
}
if (dfs(nums2double, numsSize)) return true;
else return false;
}