Leetcode 679. 24 点游戏 C++

Leetcode 679. 24 点游戏

题目

你有 4 张写有 1 到 9 数字的牌。你需要判断是否能通过 *,/,+,-,(,) 的运算得到 24。

题解

示例 1:

输入: [4, 1, 8, 7]
输出: True
解释: (8-4) * (7-1) = 24

示例 2:

输入: [1, 2, 1, 2]
输出: False

注意:

  1. 除法运算符 / 表示实数除法,而不是整数除法。例如 4 / (1 - 2/3) = 12 。
  2. 每个运算符对两个数进行运算。特别是我们不能用 - 作为一元运算符。例如,[1, 1, 1, 1] 作为输入时,表达式 -1 - 1 -1 - 1 是不允许的。
  3. 你不能将数字连接在一起。例如,输入为 [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
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值