题解 | #24点游戏算法#
24点游戏算法
http://www.nowcoder.com/practice/fbc417f314f745b1978fc751a54ac8cb
使用穷举法,第一部循环四个,然后循环三个,两次循环的不能是上一个循环的数在下一个循环使用,所以下一个循环为getArr(上一个循环,上一个循环的索引), 然后将两个循环产生的+、-、、/、的所有值进行循环作为下一个循环的参数 下一个循环因为上两个循环已经使用了两个参数,所以还剩两个参数 然后再次循环两个参数和上两个循环产生的所有的结果 依次类推 然后是三个循环产生的+、-、、/、和最后一个参数的 +、-、*、/、所以代码arr3直接取第0个就可以了 然后在最终结果中查找有没有包含24的 这种算法包含各种括号即穷举了所有的答案。
let line;
const getCalc = (arg1,arg2)=>{
let num1 = Number(arg1);
let num2 = Number(arg2);
return [num1 + num2,num1 - num2,num1 * num2,num1 / num2]
}
const getArr = (arr,index)=>{
let newArr = JSON.parse(JSON.stringify(arr));
newArr.splice(index,1)
return newArr
}
const getResult = (arr)=>{
let temp = []
let result = []
let answer = [];
let flag = false
// 初始化数组 比如数组【7,9,10,9】
for(let i =0;i<arr.length;i++){
let arr1 = getArr(arr,i);
//获取剩下的三个参数 i == 0 arr1 = [9,10,9]
for(let j = 0;j< arr1.length;j++){
//将数组中两个参数进行+、-、*、/、
temp = getCalc(arr[i],arr1[j])
//获取的任意两个参数+、-、*、/、的数组
let arr2 = getArr(arr1,j);
// [10,9]
//获取剩下的两个参数
for(let k = 0;k<arr2.length;k++){
//循环剩余两个参数
for(let l =0;l<temp.length;l++){
//循环前两个的+、-、*、/、的所有值和剩下两个参数进行 +、-、*、/、
result = getCalc(temp[l],arr2[k]);
//获取三个参数的+、-、*、/、即前两个参数的所有+、-、*、/、的值和第三个参数进行循环
let arr3 = getArr(arr2,k);
//[9]
//获取剩余最后一个参数的值
for(let m = 0; m<result.length;m++){
//循环前三个的值和最后一个参数进行+、-、*、/、
answer = getCalc(result[m],arr3[0]);
//最终的答案 ->单次循环的结果并不代表所有的
if(answer.includes(24)){
flag = true;
break;
}
}
}
}
}
}
return flag
}
while(line = readline()){
let arr = line.split(' ');
let res = getResult(arr)
console.log(res)
}