Leetcode 51.N 皇后

题目:https://leetcode.cn/problems/n-queens/

代码

  1. var solveNQueens = function (n) {
  2. // 判断位置是否合法
  3. function isValid (row, col, chessBoard, n) {
  4. // 检查列
  5. for (let i = 0; i < row; i ++){
  6. if (chessBoard[i][col] === 'Q') {
  7. return false
  8. }
  9. }
  10. // 检查45度角
  11. for (let i = row - 1, j = col - 1; i >= 0 && j >= 0; i--, j--){
  12. if (chessBoard[i][j] === 'Q') {
  13. return false
  14. }
  15. }
  16. // 检查135度角
  17. for (let i = row - 1, j = col + 1; i >= 0 && j < n; i--, j++){
  18. if (chessBoard[i][j] === 'Q') {
  19. return false
  20. }
  21. }
  22. return true
  23. }
  24. // 把二维数组转换为一维数组
  25. function transformChessBoard (chessBoard) {
  26. let chessBoardBack = []
  27. chessBoard.forEach(row => {
  28. let rowStr = ''
  29. row.forEach(value => {
  30. rowStr += value
  31. })
  32. chessBoardBack.push(rowStr)
  33. })
  34. return chessBoardBack
  35. }
  36. let res = []
  37. const backtracking = (row, chessBoard) => {
  38. // 如果到了最后一行,说明可以收集结果
  39. if (row === n) {
  40. res.push(transformChessBoard(chessBoard))
  41. return
  42. }
  43. for (let col = 0; col < n; col++){
  44. if (isValid(row, col, chessBoard, n)) {
  45. // 放置皇后
  46. chessBoard[row][col] = 'Q'
  47. backtracking(row + 1, chessBoard)
  48. // 回溯,撤销皇后
  49. chessBoard[row][col] = '.'
  50. }
  51. }
  52. }
  53. // 申请一个nxn的数组,用.填充
  54. let chessBoard = new Array(n).fill([]).map(() => new Array(n).fill('.'))
  55. backtracking(0, chessBoard)
  56. return res
  57. };

感想

  1. image.png