Categories
interview

N-Queens Js

const solveNQueens = (n) => {
  if (n < 1) {
    return [];
  }
  const ret = [];
  getAll(n, 0, ret, []);
  return ret;
};


const getAll = (n, row, ret, rowCol) => {
  if (row === n) {
    ret.push(buildSolution(rowCol, n));
    return;
  }

  for (let col = 0; col < n; col++) {
    if (isValid(row, col, rowCol)) {
      rowCol[row] = col;
      getAll(n, row + 1, ret, rowCol);
    }
  }
};

const isValid = (row, col, rowCol) => {
  for (let r = 0; r < row; r++) {
    if (rowCol[r] === col) {
      return false;
    }

    const c = rowCol[r];

    if ((row - r) === Math.abs(c - col)) {
      return false;
    }
  }
  return true;
};

const buildSolution = (rowCol, n) => {
  const ans = [];
  for (let i = 0; i < n; i++) {
    let str = '';
    for (let j = 0; j < n; j++) {
      str += rowCol[i] === j ? 'Q' : '.';
    }
    ans.push(str);
  }
  return ans;
};