Leetcode 679. 24 点游戏
题目
你有 4 张写有 1 到 9 数字的牌。你需要判断是否能通过 *,/,+,-,(,) 的运算得到 24。
题解
示例 1:
输入: [4, 1, 8, 7]
输出: True
解释: (8-4) * (7-1) = 24
示例 2:
输入: [1, 2, 1, 2]
输出: False
注意:
- 除法运算符 / 表示实数除法,而不是整数除法。例如 4 / (1 - 2/3) = 12 。
- 每个运算符对两个数进行运算。特别是我们不能用 - 作为一元运算符。例如,[1, 1, 1, 1] 作为输入时,表达式 -1 - 1 -1 - 1 是不允许的。
- 你不能将数字连接在一起。例如,输入为 [1, 2, 1, 2] 时,不能写成 12 + 12 。
题解
dfs深搜回溯
当数组中只有两个数时,则直接进行运算,因为之前的除法可能导致一些误差,因此只要在误差允许范围内我们就认为能构成24点。
当数组中有多于两个数时,我们选其中两个数进行运算,将结果放入数组中,并将这两个数删除,这样数组中的数会少1,进行深搜回溯。
详细过程见代码
代码
bool judgePoint24_1(double a) { //在误差范围内,我们就认定a==24
return abs(a - 24) < 1e-6;
}
bool dfs(vector<double>& nums){
if(nums.size() == 2){ //只剩两个数时,直接进行运算
if(judgePoint24_1(nums[0]+nums[1])) return true;
else if(judgePoint24_1(abs(nums[0]-nums[1]))) return true;
else if(judgePoint24_1(nums[0]*nums[1])) return true;
else if((nums[1]!=0 && judgePoint24_1(nums[0]/nums[1])) || (nums[0]!=0 && judgePoint24_1(nums[1]/nums[0]))) return true;
return false;
}else{
for(int i=0; i<nums.size()-1; i++){ //选取nums[i]
for(int j=i+1; j<nums.size(); j++){ //选取nums[j]
vector<double> conlude = nums;
conlude.erase(conlude.begin()+j); //删除nums[j]
conlude.erase(conlude.begin()+i); //删除nums[i]
conlude.push_back(nums[i]+nums[j]); //将结果放入数组中
if(dfs(conlude)) return true; //深搜
conlude.pop_back(); //回溯
conlude.push_back(nums[i]-nums[j]);
if(dfs(conlude)) return true;
conlude.pop_back();
conlude.push_back(nums[j]-nums[i]);
if(dfs(conlude)) return true;
conlude.pop_back();
conlude.push_back(nums[i]*nums[j]);
if(dfs(conlude)) return true;
conlude.pop_back();
if(nums[j] != 0){
conlude.push_back(nums[i]/nums[j]);
if(dfs(conlude)) return true;
conlude.pop_back();
}
if(nums[i] != 0){
conlude.push_back(nums[j]/nums[i]);
if(dfs(conlude)) return true;
conlude.pop_back();
}
}
}
}
return false;
}
bool judgePoint24(vector<int>& nums) {
vector<double> num = vector<double>(nums.begin(),nums.end());
return dfs(num);
}
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/24-game
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。