面试题 08.12. 八皇后

注意: 主/副对角线
image.png

  1. var solveNQueens = function(n) {
  2. let res = [];
  3. let prev = [];
  4. dfs(n, 0, prev, res)
  5. // console.log(res)
  6. // return res;
  7. let queens = [];
  8. for (let i=0; i < res.length; i++) {
  9. let queen = generate(n, res[i])
  10. queens.push(queen)
  11. }
  12. return queens
  13. };
  14. function dfs(n, row, prev, res) {
  15. if (row == n) {
  16. res.push(prev.slice());
  17. return;
  18. }
  19. for (let col = 0; col < n; col++) {
  20. if (verified(n, prev, col)) {
  21. prev.push(col);
  22. dfs(n, row+1, prev, res);
  23. // 回溯
  24. prev.pop();
  25. }
  26. }
  27. }
  28. function verified(n, path, col) {
  29. // 行: 放置在prev.length
  30. // 列
  31. // 主对角线
  32. // 副对角线
  33. for (let row=0; row<path.length; row++) {
  34. let diff = Math.abs(path[row] - col); // 当前行所在列与目标列的距离
  35. if (diff == 0 || diff == path.length - row) return false;
  36. // 不在一列 不在主副线上: 与目标列的距离不等于到目标行的巨鳖
  37. }
  38. return true;
  39. }
  40. function generate(n, path) {
  41. let queen = Array.from({length: n}, (v, i) => {
  42. let col = new Array(n).fill('.')
  43. let index = path[i];
  44. col[index] = 'Q'
  45. return col.join('');
  46. })
  47. return queen
  48. }

面试题 08.13. 堆箱子

参考:

https://juejin.cn/post/6844903589652103181