image.png

思路

  • 在进入递归之前就判断
  • 检查之前的状态,如果新的状态可能出现冲突,那么就不进行回溯操作
  • 宁可之前设置好大小,好过一个一个去插入

    代码

    代码是抄的人家的,重点看看好在哪里
  1. class Solution {
  2. private:
  3. vector<vector<string>> result;
  4. void backtracking(int n, int row, vector<string>& chessboard) {
  5. if(row == n) {
  6. result.push_back(chessboard);
  7. return;
  8. }
  9. for(int col = 0; col < n; col++) {
  10. // 检查之前的状态,如果新的状态出现冲突,那么就不进行回溯操作
  11. if(isValid(row, col, chessboard, n)) {
  12. chessboard[row][col] = 'Q';
  13. backtracking(n, row + 1, chessboard);
  14. chessboard[row][col] = '.';
  15. }
  16. }
  17. }
  18. bool isValid(int row, int col, vector<string>& chessboard, int n) {
  19. int count = 0;
  20. for(int i = 0; i < row; i++) {
  21. if(chessboard[i][col] == 'Q') return false;
  22. }
  23. for(int i = row - 1, j = col - 1; i >= 0 && j >= 0; i--, j--) {
  24. if(chessboard[i][j] == 'Q') return false;
  25. }
  26. for(int i = row - 1, j = col + 1; i >=0 && j < n; i--, j++) {
  27. if(chessboard[i][j] == 'Q') return false;
  28. }
  29. return true;
  30. }
  31. public:
  32. vector<vector<string>> solveNQueens(int n) {
  33. result.clear();
  34. std::vector<std::string> chessboard(n, std::string(n, '.'));
  35. backtracking(n, 0, chessboard);
  36. return result;
  37. }
  38. };