JS回溯算法:全排列/N皇后/组合总和
请用JavaScript回溯算法解决全排列和N皇后问题,并总结回溯模板。
回答
我还是少年
function permute(nums) {
const res = [], path = [], used = new Array(nums.length).fill(false);
function backtrack() {
if (path.length === nums.length) { res.push([...path]); return; }
for (let i = 0; i < nums.length; i++) {
if (used[i]) continue;
used[i] = true;
path.push(nums[i]);
backtrack();
path.pop();
used[i] = false;
}
}
backtrack();
return res;
}
function solveNQueens(n) {
const res = [];
const board = Array.from({length: n}, () => new Array(n).fill('.'));
function isValid(row, col) {
for (let i = 0; i < row; i++) {
if (board[i][col] === 'Q') return false;
if (col - (row - i) >= 0 && board[i][col - (row - i)] === 'Q') return false;
if (col + (row - i) < n && board[i][col + (row - i)] === 'Q') return false;
}
return true;
}
function backtrack(row) {
if (row === n) { res.push(board.map(r => r.join(''))); return; }
for (let col = 0; col < n; col++) {
if (!isValid(row, col)) continue;
board[row][col] = 'Q';
backtrack(row + 1);
board[row][col] = '.';
}
}
backtrack(0);
return res;
}
回溯模板:1)选择→路径记录→递归→撤销选择;2)剪枝优化;3)排列问题关注used数组,组合问题关注startIndex。