当前位置:首页 > JavaScript

js实现24点算法

2026-03-01 21:47:55JavaScript

24点算法实现思路

24点游戏要求通过加、减、乘、除四则运算,使得4个数字的运算结果为24。以下是用JavaScript实现的核心方法:

js实现24点算法

递归穷举所有可能组合

采用递归方式遍历所有数字和运算符的排列组合:

js实现24点算法

function calculate24(numbers) {
  if (numbers.length === 1) {
    return Math.abs(numbers[0] - 24) < 1e-6;
  }

  for (let i = 0; i < numbers.length; i++) {
    for (let j = 0; j < numbers.length; j++) {
      if (i === j) continue;

      const remaining = numbers.filter((_, index) => index !== i && index !== j);
      const a = numbers[i], b = numbers[j];

      // 尝试所有运算符
      if (tryCombine(a + b, remaining)) return true;
      if (tryCombine(a - b, remaining)) return true;
      if (tryCombine(b - a, remaining)) return true;
      if (tryCombine(a * b, remaining)) return true;
      if (b !== 0 && tryCombine(a / b, remaining)) return true;
      if (a !== 0 && tryCombine(b / a, remaining)) return true;
    }
  }
  return false;
}

function tryCombine(value, remaining) {
  return calculate24([value, ...remaining]);
}

优化版本记录运算过程

以下实现会记录具体的运算步骤:

function solve24(numStr) {
  const nums = numStr.split('').map(Number);
  const solutions = [];

  function dfs(list, path) {
    if (list.length === 1) {
      if (Math.abs(list[0] - 24) < 1e-6) {
        solutions.push(path[0]);
      }
      return;
    }

    for (let i = 0; i < list.length; i++) {
      for (let j = 0; j < list.length; j++) {
        if (i === j) continue;

        const next = [];
        const newPath = [];
        for (let k = 0; k < list.length; k++) {
          if (k !== i && k !== j) {
            next.push(list[k]);
            newPath.push(path[k]);
          }
        }

        const a = list[i], b = list[j];
        const aPath = path[i], bPath = path[j];

        // 加法
        next.push(a + b);
        newPath.push(`(${aPath} + ${bPath})`);
        dfs(next, newPath);
        next.pop(); newPath.pop();

        // 减法(两种顺序)
        next.push(a - b);
        newPath.push(`(${aPath} - ${bPath})`);
        dfs(next, newPath);
        next.pop(); newPath.pop();

        next.push(b - a);
        newPath.push(`(${bPath} - ${aPath})`);
        dfs(next, newPath);
        next.pop(); newPath.pop();

        // 乘法
        next.push(a * b);
        newPath.push(`(${aPath} * ${bPath})`);
        dfs(next, newPath);
        next.pop(); newPath.pop();

        // 除法(两种顺序,且除数不为0)
        if (b !== 0) {
          next.push(a / b);
          newPath.push(`(${aPath} / ${bPath})`);
          dfs(next, newPath);
          next.pop(); newPath.pop();
        }

        if (a !== 0) {
          next.push(b / a);
          newPath.push(`(${bPath} / ${aPath})`);
          dfs(next, newPath);
          next.pop(); newPath.pop();
        }
      }
    }
  }

  dfs(nums, nums.map(String));
  return solutions.length > 0 ? solutions[0] : "No solution found";
}

使用示例

console.log(solve24("1234"));  // 输出类似:(4 * (1 + (3 + 2)))
console.log(calculate24([1, 2, 3, 4])); // 输出: true

注意事项

  1. 浮点数比较使用近似判断Math.abs(result - 24) < 1e-6,避免精度问题
  2. 除法运算时需要检查除数不为0
  3. 算法时间复杂度为O(4! * 4^3) ≈ O(1536),对于4个数字完全可接受
  4. 如需显示所有解而非第一个解,可以收集solutions数组中的所有结果

这种方法通过深度优先搜索遍历所有可能的运算顺序和组合,能够找到是否存在解以及具体的运算步骤。

标签: 算法js
分享给朋友:

相关文章

js实现全选

js实现全选

实现全选功能的方法 在JavaScript中实现全选功能通常涉及监听全选复选框的点击事件,并根据其状态控制其他复选框的选中状态。以下是几种常见的实现方式: 基础DOM操作实现 通过获取所有目标复选框…

js 实现分页

js 实现分页

实现分页的基本逻辑 分页功能通常需要后端返回数据总量或总页数,前端根据当前页码和每页条数截取对应数据。以下是一个基于JavaScript的简单分页实现方案: 前端分页实现 假设已有从后端获取的完整数…

js实现论坛

js实现论坛

实现论坛的基本功能 使用JavaScript实现一个论坛需要结合前端和后端技术。前端可以使用React、Vue或Angular等框架,后端可以选择Node.js配合Express或Koa框架。数据库可…

js实现二叉树

js实现二叉树

二叉树的基本概念 二叉树是一种树形数据结构,每个节点最多有两个子节点,分别称为左子节点和右子节点。二叉树的常见操作包括插入、删除、遍历等。 二叉树的节点定义 在JavaScript中,二叉树的节点可…

js树实现

js树实现

树的基本概念 树是一种非线性的数据结构,由节点和边组成。每个节点包含一个值和指向子节点的引用。树的顶部节点称为根节点,没有子节点的节点称为叶节点。 树的实现方式 在JavaScript中,树可以通过…

js实现图片

js实现图片

图片加载与显示 在JavaScript中,可以通过Image对象动态加载图片。创建实例后设置src属性触发加载,通过onload回调处理加载完成后的操作: const img = new Ima…