1. /**
    2. * @param {number} n
    3. * @return {string[][]}
    4. */
    5. let result = [];
    6. var solveNQueens = function(n) {
    7. result = [];
    8. let board = [];
    9. for (let i = 0; i < n; i++) {
    10. board[i] = [];
    11. for (let j = 0; j < n; j++) {
    12. board[i][j] = '.'
    13. }
    14. }
    15. backtrack(0, board, n);
    16. return result;
    17. };
    18. function deepClone(board) {
    19. let res = [];
    20. for (let i = 0; i < board.length; i++) {
    21. res.push(board[i].join(''));
    22. }
    23. return res;
    24. }
    25. function backtrack(row, board, n) {
    26. if (row === n) {
    27. result.push(deepClone(board));
    28. return;
    29. }
    30. for (let j = 0; j < n; j++) {
    31. if (checkInValid(board, row, j, n)) continue;
    32. board[row][j] = 'Q';
    33. backtrack(row + 1, board, n);
    34. board[row][j] = '.';
    35. }
    36. }
    37. function checkInValid(board, row, column, n) {
    38. // 行
    39. for (let i = 0; i < n; i++) {
    40. if (board[i][column] === 'Q') return true;
    41. }
    42. for (let i = row - 1, j = column + 1; i >= 0 && j < n; i--, j++) {
    43. if (board[i][j] === 'Q') return true;
    44. }
    45. for (let i = row - 1, j = column - 1; i >= 0 && j >= 0; i--, j--) {
    46. if (board[i][j] === 'Q') return true;
    47. }
    48. return false;
    49. }