当前位置:   article > 正文

C++ | Leetcode C++题解之第51题N皇后

C++ | Leetcode C++题解之第51题N皇后

题目:

题解:

  1. class Solution {
  2. public:
  3. vector<vector<string>> solveNQueens(int n) {
  4. auto solutions = vector<vector<string>>();
  5. auto queens = vector<int>(n, -1);
  6. auto columns = unordered_set<int>();
  7. auto diagonals1 = unordered_set<int>();
  8. auto diagonals2 = unordered_set<int>();
  9. backtrack(solutions, queens, n, 0, columns, diagonals1, diagonals2);
  10. return solutions;
  11. }
  12. void backtrack(vector<vector<string>> &solutions, vector<int> &queens, int n, int row, unordered_set<int> &columns, unordered_set<int> &diagonals1, unordered_set<int> &diagonals2) {
  13. if (row == n) {
  14. vector<string> board = generateBoard(queens, n);
  15. solutions.push_back(board);
  16. } else {
  17. for (int i = 0; i < n; i++) {
  18. if (columns.find(i) != columns.end()) {
  19. continue;
  20. }
  21. int diagonal1 = row - i;
  22. if (diagonals1.find(diagonal1) != diagonals1.end()) {
  23. continue;
  24. }
  25. int diagonal2 = row + i;
  26. if (diagonals2.find(diagonal2) != diagonals2.end()) {
  27. continue;
  28. }
  29. queens[row] = i;
  30. columns.insert(i);
  31. diagonals1.insert(diagonal1);
  32. diagonals2.insert(diagonal2);
  33. backtrack(solutions, queens, n, row + 1, columns, diagonals1, diagonals2);
  34. queens[row] = -1;
  35. columns.erase(i);
  36. diagonals1.erase(diagonal1);
  37. diagonals2.erase(diagonal2);
  38. }
  39. }
  40. }
  41. vector<string> generateBoard(vector<int> &queens, int n) {
  42. auto board = vector<string>();
  43. for (int i = 0; i < n; i++) {
  44. string row = string(n, '.');
  45. row[queens[i]] = 'Q';
  46. board.push_back(row);
  47. }
  48. return board;
  49. }
  50. };
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/499078
推荐阅读
相关标签
  

闽ICP备14008679号