使用回溯法实现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
相关产品推荐
相关产品推荐

