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

使用回溯法实现N皇后问题的JavaScript代码报错求助

问题分析与解决

错误根源

你遇到的TypeError: Cannot set property '0' of undefined错误,核心原因是棋盘数组初始化失败。在创建boolArrBoard时,Array.from的回调函数使用大括号包裹代码但未添加return语句,导致数组的每一项都是undefined,而非预期的false填充子数组:

// 错误写法:大括号包裹但无return,返回undefined
let boolArrBoard = Array.from({length: n}, () => {
    new Array(n).fill(false)
})

解决方法

修复数组初始化逻辑,确保回调函数返回创建的子数组:

  • 去掉大括号,箭头函数会自动返回表达式结果;
  • 或者在大括号内显式添加return关键字。

另外,display函数使用for...in遍历数组存在隐患(会遍历到数组原型链上的属性),建议改用for...of或普通for循环,避免意外问题。

修正后的完整代码

function nQueen(boolArrBoard, row) {
    if (row === boolArrBoard.length) {
        display(boolArrBoard);
        return 1; // 计数当前解
    }

    let count = 0;
    // 遍历当前行的每一列,尝试放置皇后
    for (let col = 0; col < boolArrBoard.length; col++) {
        if (isSafe(boolArrBoard, row, col)) {
            boolArrBoard[row][col] = true;
            count += nQueen(boolArrBoard, row + 1);
            boolArrBoard[row][col] = false; // 回溯,撤销放置
        }
    }
    return count;
}

function isSafe(boolArrBoard, row, col) {
    // 检查垂直方向(上方同列是否有皇后)
    for (let i = 0; i < row; i++) {
        if (boolArrBoard[i][col]) {
            return false;
        }
    }

    // 检查左上方对角线
    let maxLeft = Math.min(row, col);
    for (let i = 1; i <= maxLeft; i++) {
        if (boolArrBoard[row - i][col - i]) {
            return false;
        }
    }

    // 检查右上方对角线
    let maxRight = Math.min(row, boolArrBoard.length - col - 1);
    for (let i = 1; i <= maxRight; i++) {
        if (boolArrBoard[row - i][col + i]) {
            return false;
        }
    }

    return true;
}

function display(boolArrBoard) {
    // 改用for...of遍历数组,避免for...in的原型链遍历问题
    for (const row of boolArrBoard) {
        let line = '';
        for (const cell of row) {
            line += cell ? 'Q' : 'X';
        }
        console.log(line);
    }
    console.log('---'); // 分隔不同解法
}

let n = 4;
// 修正数组初始化:去掉大括号,自动返回子数组
let boolArrBoard = Array.from({ length: n }, () => new Array(n).fill(false));
const totalSolutions = nQueen(boolArrBoard, 0);
console.log(`总共有 ${totalSolutions} 种解法`);

运行结果

当n=4时,会输出两种合法的N皇后布局:

XQXX
XXXQ
QXXX
XXQX
---
XXQX
QXXX
XXXQ
XQXX
---
总共有 2 种解法

内容的提问来源于stack exchange,提问作者Adwaith Athman

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 05:24:19