CodeWalk

JS回溯算法:全排列/N皇后/组合总和

作者:我还是少年 · 2026-05-30 12:55

请用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。