You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在自引用对象字面量中更新动态属性?JS实现DLX遇阻

嘿,我懂你在实现DLX算法时遇到的这个麻烦——在构建节点的自引用邻接关系时,直接遍历赋值肯定会出问题,毕竟当你处理某个位置时,它的上下左右邻居可能还没被创建出来呢!咱们来一步步解决这个问题:

核心思路

要解决这个自引用对象的问题,我们得分两步走:

  1. 先批量创建所有节点:遍历矩阵,把每个1替换为带基础信息的节点对象(先不处理邻接引用),0保持不变,将这些节点暂存在一个二维数组中。
  2. 补全邻接引用:再次遍历每个节点,根据坐标找到上下左右相邻的1对应的节点,直接引用这些已经存在的节点对象,完成邻接属性的赋值。
完整实现代码
export const constructDataObjects = matrix => {
  const totalRows = matrix.length;
  if (totalRows === 0) return [];
  const totalCols = matrix[0].length;
  
  // 第一步:初始化所有节点,先存到nodes数组里,邻接属性后续补全
  const nodes = Array.from({ length: totalRows }, (_, rowIdx) => 
    Array.from({ length: totalCols }, (_, colIdx) => {
      if (matrix[rowIdx][colIdx] === 1) {
        return {
          row: rowIdx,
          col: colIdx,
          u: null, // 上邻节点
          d: null, // 下邻节点
          l: null, // 左邻节点
          r: null  // 右邻节点
        };
      }
      return 0; // 非1的位置保留原0值
    })
  );

  // 第二步:遍历每个节点,补全邻接引用
  for (let i = 0; i < totalRows; i++) {
    for (let j = 0; j < totalCols; j++) {
      const current = nodes[i][j];
      if (current === 0) continue; // 跳过非1的位置

      // 处理上方邻接
      if (i > 0) {
        current.u = nodes[i-1][j] !== 0 ? nodes[i-1][j] : null;
      }
      // 处理下方邻接
      if (i < totalRows - 1) {
        current.d = nodes[i+1][j] !== 0 ? nodes[i+1][j] : null;
      }
      // 处理左方邻接
      if (j > 0) {
        current.l = nodes[i][j-1] !== 0 ? nodes[i][j-1] : null;
      }
      // 处理右方邻接
      if (j < totalCols - 1) {
        current.r = nodes[i][j+1] !== 0 ? nodes[i][j+1] : null;
      }
    }
  }

  return nodes;
};
关键细节说明
  • 避免引用未定义:先创建所有节点再补全引用,确保我们要引用的邻接节点已经存在于nodes数组中,不会出现undefined的情况。
  • 适配非方阵:代码中用totalCols = matrix[0].length获取列数,兼容行数和列数不同的矩阵(你的原代码里用matrix.length作为列数,这只适用于方阵,容易出bug)。
  • DLX循环链表扩展(可选):如果你的DLX实现需要循环链表结构(比如列头的上下循环、行的左右循环),可以在补全引用时调整逻辑——比如当当前节点是列的第一个节点时,u指向列的最后一个节点;行的第一个节点的l指向行的最后一个节点,以此类推。

内容的提问来源于stack exchange,提问作者Red Mercury

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 08:31:49