Problem: 51. N 皇后
Reference
https://www.programmercarl.com/0051.N%E7%9A%87%E5%90%8E.html
思路
使用回溯算法解题。
具体还得看图。
二维的图形没有一维的数组好描述,先这样。
重要的是判断合法,判断合法中只需要遍历行是否有’Q’就可以了,因为列在外层遍历了。
同时判断左上角斜线和右上角斜线有没有’Q’,这里只要从当前元素往上走就可以了。
如下: 一个往走上走判断是否越界,一个往右上走是否越界,这里要注意,往右上走,行是减少,列是增加。
最后初始化棋盘的时候,注意string的初始化方式,std::string(n, '.')
1 2 3 4 5 6 7 8 9 10
| for (int i = row - 1,j = col - 1; i >= 0 && j >= 0; i--, j--) { if (chessbroad[i][j] == 'Q') return false; } for (int i = row - 1,j = col + 1; i >= 0 && j < n; i--, j++) { if (chessbroad[i][j] == 'Q') return false; }
|
复杂度
时间复杂度:
添加时间复杂度, 示例: $O(n)$
空间复杂度:
添加空间复杂度, 示例: $O(n)$
Code
[]1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
| class Solution { public: vector<vector<string>> res; void backTracing(int n, int row, vector<string> chessbroad) { if (row == n) { res.push_back(chessbroad); return; } for (int col = 0; col < n; col++) { if (isValidate(row, col, chessbroad, n)) { chessbroad[row][col] = 'Q'; backTracing(n, row + 1, chessbroad); chessbroad[row][col] = '.'; } } } bool isValidate(int row, int col, vector<string> chessbroad, int n) { for (int i = 0; i < n; i++) { if (chessbroad[i][col] == 'Q') { return false; } } for (int i = row - 1,j = col - 1; i >= 0 && j >= 0; i--, j--) { if (chessbroad[i][j] == 'Q') return false; } for (int i = row - 1,j = col + 1; i >= 0 && j < n; i--, j++) { if (chessbroad[i][j] == 'Q') return false; } return true; } vector<vector<string>> solveNQueens(int n) { vector<string> chessbroad(n, std::string(n, '.')); backTracing(n, 0, chessbroad); return res; } };
|