题解 | #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));
}()
