题解 | #24点游戏算法#

24点游戏算法

https://www.nowcoder.com/practice/fbc417f314f745b1978fc751a54ac8cb

//不考虑括号的情况,解决不了(5 9 7 1)(2 2 7 6)这些问题。14/20 组用例通过
void async function () {
    const nums = (await readline()).split(" ").map(Number);
    const dfs = (i,sum) =>{
        if(i === 4) return (sum===24);
        return dfs(i+1,sum+nums[i]) || dfs(i+1,sum-nums[i]) || dfs(i+1,nums[i]-sum) || dfs(i+1,sum*nums[i]) || (nums[i]!=0?dfs(i+1,sum/nums[i]):false)|| (sum!=0?dfs(i+1,nums[i]/sum):false);

    }    
    console.log(dfs(0,0));
}()

//方法二:深度优先搜索,不断选取列表中的两个数字来进行加减乘除运算,运算结果代替原列表中的两个元素。即[2,2,7,6]=>[2,6,(2+7)]=>[6,2*(2+7)]=>[6+2*(2+7)]=>[24]=>return nums[0] === 24;
void async function () {
    const dfs = (nums) => {
        if(nums.length === 1) return nums[0] === 24;
        // console.log(nums);
        let flag = false;
        for(let i = 0; i < nums.length; i++){
            for(let j = i+1; j<nums.length; j++){
                const arr = [...nums]
                arr.splice(j,1);
                arr.splice(i,1);
                flag = flag || dfs([...arr,nums[i]+nums[j]]) || dfs([...arr,nums[i]*nums[j]]) || dfs([...arr,nums[i]-nums[j]]) || dfs([...arr,nums[j]-nums[i]]);
                if(nums[i] !=0) flag = flag || dfs([...arr,nums[j]/nums[i]])
                if(nums[j] !=0) flag = flag || dfs([...arr,nums[i]/nums[j]])
            }
        }
        return flag;
    }
    const nums = (await readline()).split(" ").map(Number);
    // console.log(true);
    console.log(dfs(nums));
}()

全部评论

相关推荐

算法丰川祥:实际就两个人给他投,它这么说好显得自己比较抢手
点赞 评论 收藏
分享
评论
2
1
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务