图-搜索-dfs-739. 24点

2020-04-04 19:46:42

问题描述:

你有 4 张卡片, 每一张上面都有一个 1 到 9 的数字. 你需要判断是否能用运算符 */+-() 来计算得到 24

样例

样例 1:

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

样例 2:

输入:[1, 1, 1, 2]
输出:false
解释:无法得到24

样例 3:

输入:[3, 3, 8, 8]
输出:true
解释:8 / ( 3 - 8 / 3) = 24

注意事项

除法运算符 / 是真正的除法, 而不是整数除法. 所以 4 / (1 - 2 / 3) = 12.
所有的运算符位于两个数字之间. 尤其是, 我们不能将 - 当做一个一元运算符. 比如说, 输入为[1, 1, 1, 1], 表达式 - 1 - 1 - 1 - 1 是不允许的
你不能将数字 串联 起来. 比如, 如果输入为 [1, 2, 1, 2], 我们不能写成 12 + 12

问题求解:

直接暴力搜索。

    public boolean compute24(double[] nums) {
        // write your code here
        return compute(nums, 4);
    }
    public boolean compute(double[] nums, int n) {
        if (n == 1) {  
            if (Math.abs(nums[0] - 24) <= 1E-6) return true; 
            else return false;
        }  
        for(int i = 0; i < n; i ++) {
            for (int j = i + 1; j < n; j++) {
                double a, b;   
                a = nums[i];  
                b = nums[j];  
                nums[j] = nums[n - 1];  
                nums[i] = a + b;  
                if (compute(nums, n - 1)) {
                	return true;
    			}
                nums[i] = a - b;  
                if (compute(nums, n - 1)) {
                	return true;
    			}  
                nums[i] = b - a;  
                if (compute(nums, n - 1)) {
                	return true;
    			} 
                nums[i]=a * b;  
                if (compute(nums, n - 1)) {
                	return true;
    			}  
                if (b != 0){  
                    nums[i] = a / b;  
                    if(compute(nums, n - 1)) {
                		return true;
    				}  
                }  
                if (a != 0){ 
                    nums[i] = b / a;  
                    if(compute(nums, n - 1)) {
                		return true;
    				}  
                }  
                nums[i] = a;  
                nums[j] = b;  
            }  
        }
    	return false; 
    }

  

 

posted @ 2020-04-04 19:49  hyserendipity  阅读(227)  评论(0编辑  收藏  举报