n 皇后问题 研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。
给你一个整数 n ,返回所有不同的 n皇后问题 的解决方案。
每一种解法包含一个不同的 n 皇后问题 的棋子放置方案,该方案中 'Q''.' 分别代表了皇后和空位。
示例 1:
51.N 皇后 - 图1

  1. 输入:n = 4
  2. 输出:[[".Q..","...Q","Q...","..Q."],["..Q.","Q...","...Q",".Q.."]]
  3. 解释:如上图所示,4 皇后问题存在两个不同的解法。

示例 2:

  1. 输入:n = 1
  2. 输出:[["Q"]]

提示:

  • 1 <= n <= 9

解法一:回溯

  1. function solveNQueens(n: number): string[][] {
  2. //
  3. let res :Array<Array<number>> = []
  4. let cols : Set<number> = new Set()
  5. let pies : Set<number> = new Set()
  6. let nas :Set<number> = new Set()
  7. function recursion(row: number, list:Array<number>) {
  8. if (row === n) {
  9. res.push([...list])
  10. return
  11. }
  12. for(let col = 0 ; col < n; col ++) {
  13. // 列、撇、捺 中是否存在
  14. if (cols.has(col) || pies.has(row + col) || nas.has(row-col)) {
  15. continue
  16. }
  17. cols.add(col)
  18. pies.add(row+col)
  19. nas.add(row - col)
  20. list.push(col)
  21. recursion(row + 1, list)
  22. cols.delete(col)
  23. pies.delete(row + col)
  24. nas.delete(row - col)
  25. list.pop()
  26. }
  27. }
  28. recursion(0, [])
  29. // console.log(res)
  30. function genStr(nums: Array<Array<number>>, n : number): Array<Array<string>> {
  31. return nums.map(list => list.map(i => '.'.repeat(i) + "Q" + ".".repeat( n - i - 1)))
  32. }
  33. return genStr(res, n)
  34. };