列表

详情


NC350. 24点游戏算法

描述

给出4个1-10的数字,通过加减乘除运算,得到数字为24就算胜利,除法指实数除法运算,运算符仅允许出现在两个数字之间,本题对数字选取顺序无要求,但每个数字仅允许使用一次,且需考虑括号运算
此题允许数字重复,如3 3 4 4为合法输入,此输入一共有两个3,但是每个数字只允许使用一次,则运算过程中两个3都被选取并进行对应的计算操作。

示例1

输入:

[7,2,1,10]

输出:

true

说明:

7*2+1*10

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++ 解法, 执行用时: 3ms, 内存消耗: 440KB, 提交时间: 2022-07-26

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param nums int整型vector 
     * @return bool布尔型
     */
    bool is24(vector<int>& n, int num)
    {
        if(num == 24) return true;
        for(int i=0; i<n.size(); ++i){
            int tmp = n[i];
            n.erase(n.begin() + i);
            if(is24(n, tmp)) return true;
            if(is24(n, num+tmp)) return true;
            if(is24(n, num-tmp)) return true;
            if(is24(n, tmp-num)) return true;
            if(is24(n, num*tmp)) return true;
            if(num!=0 && num%tmp==0 && is24(n, num/tmp)) return true;
            if(num!=0 && tmp%num==0 && is24(n, tmp/num)) return true;
            n.insert(n.begin() + i, tmp);
        }
        return false;
    }
    
    bool Point24(vector<int>& nums) {
        return is24(nums,  0);
    }
};

C++ 解法, 执行用时: 3ms, 内存消耗: 440KB, 提交时间: 2022-03-18

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param nums int整型vector 
     * @return bool布尔型
     */
    double get(double x,double y,int flag)
    {
        if(flag == 0) return x+y;
        else if(flag == 1) return x-y;
        else if(flag == 2) return x*y;
        return x/y;
    }
     
    bool dfs(vector<double>& a)
    {
        int n = a.size();
        if(n==0) return false;
        if(n==1) return fabs(a[0]-24.0)<1e-6;
         
        for(int i=0;i<n;i++)
        {
            for(int j=0;j<n;j++)
            {
                if(i==j) continue;
                vector<double> temp;//存放剩余数字
                for(int k=0;k<n;k++)
                {
                    if(k==i||k==j) continue;
                    temp.push_back(a[k]);
                }
                //进行四种运算
                for(int k=0;k<4;k++)
                {
                    double result = get(a[i],a[j],k);
                    temp.push_back(result);
                    if(dfs(temp)) return true;
                    temp.pop_back();//回溯
                }
            }
        }
        return false;
    }
    bool Point24(vector<int>& nums) {
        // write code here
        vector<double> res(nums.begin(),nums.end());
        return dfs(res);
    }
};

C++ 解法, 执行用时: 3ms, 内存消耗: 476KB, 提交时间: 2022-07-21

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param nums int整型vector 
     * @return bool布尔型
     */
    bool dfs(vector<double>& res)
    {
        int n=res.size();
        if(n==0) return false;
        if(n==1 && res[0]==24) return true;
        
        for(int i=0;i<n;i++)
        {
            for(int j=0;j<n;j++)
            {
                if(i!=j)
                {
                    vector<double> new_res;
                    for(int k=0;k<n;k++)
                    {
                        if(k!=i&&k!=j){
                            new_res.push_back(res[k]);
                        }
                    }
                    for(int op=0;op<4;++op)
                    {
                        if(op==0)
                            new_res.push_back(res[i]+res[j]);
                        else if(op==1)
                            new_res.push_back(res[i]-res[j]);
                        else if(op==2)
                            new_res.push_back(res[i]*res[j]);
                        else if(op==3){
                            if(res[j]==0) continue;
                            new_res.push_back(res[i]/res[j]);
                        }
                        if(dfs(new_res)) return true;
                        new_res.pop_back();
                    }
                }
            }
        }
        return false;
    }
    bool Point24(vector<int>& nums) {
        // write code here
        vector<double> res(nums.begin(),nums.end());
        return dfs(res);
    }
};

Go 解法, 执行用时: 3ms, 内存消耗: 1108KB, 提交时间: 2022-06-30

package main

import "math"

func Point24(nums []int) bool {

	a := make([]float64, len(nums))
	for i := range a {
		a[i] = float64(nums[i])
	}
	return dfs(a)
}

func dfs(nums []float64) bool {
	if len(nums) == 1 {
		return math.Abs(nums[0]-24) < 1e-9
	}

	f := false
	for i := 0; i < len(nums); i++ {
		for j := i + 1; j < len(nums); j++ {
			x, y := nums[i], nums[j]
			b := make([]float64, 0, len(nums))
			for k := 0; k < len(nums); k++ {
				if k != i && k != j {
					b = append(b, nums[k])
				}
			}

			f = f || dfs(append(b, x+y))
			f = f || dfs(append(b, x-y))
			f = f || dfs(append(b, y-x))
			f = f || dfs(append(b, x*y))
			if x != 0 {
				f = f || dfs(append(b, y/x))
			}
			if y != 0 {
				f = f || dfs(append(b, x/y))
			}
			if f {
				return true
			}
		}
	}
	return false
}

Go 解法, 执行用时: 3ms, 内存消耗: 1140KB, 提交时间: 2022-07-26

package main
//import "fmt"

/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 
 * @param nums int整型一维数组 
 * @return bool布尔型
*/
func Point24(nums []int) bool {
	// write code here
	first := nums[0]
	for i := 1; i < len(nums); i++ {
		// 两两进行计算
		if i == 1 {
			res1 := calResult(first, nums[1])
			res2 := calResult(nums[2], nums[3])
			for _, v1 := range res1 {
				for _, v2 := range res2 {
					if isTarget(calResult(v1, v2), 24) {
						return true
					}
				}
			}

		}
		if i == 2 {
			res1 := calResult(first, nums[2])
			res2 := calResult(nums[1], nums[3])
			for _, v1 := range res1 {
				for _, v2 := range res2 {
					if isTarget(calResult(v1, v2), 24) {
						return true
					}
				}
			}

		}
		if i == 3 {
			res1 := calResult(first, nums[3])
			res2 := calResult(nums[1], nums[2])
			for _, v1 := range res1 {
				for _, v2 := range res2 {
					if isTarget(calResult(v1, v2), 24) {
						return true
					}
				}
			}

		}

	}
	return false
}
func calResult(a, b int) []int {
	result := make([]int, 0)
	result = append(result, a+b)
	result = append(result, a-b)
	result = append(result, b-a)
	result = append(result, b*a)
	if b != 0 {
		result = append(result, a/b)
	}
	if a != 0 {
		result = append(result, b/a)
	}
	return result

}
func isTarget(input []int, target int) bool {
	for i := 0; i < len(input); i++ {
		if input[i] == target {
			return true
		}
	}
	return false
}

上一题