0051.N皇后:优化排版,补充Swift版本

This commit is contained in:
bqlin
2021-12-17 18:53:51 +08:00
parent a8f8f21ba9
commit 879886acb3

View File

@ -33,7 +33,7 @@ n 皇后问题 研究的是如何将 n 个皇后放置在 n×n 的棋盘上,
**如果对回溯算法基础还不了解的话,我还特意录制了一期视频:[带你学透回溯算法(理论篇)](https://www.bilibili.com/video/BV1cy4y167mM/)** 可以结合题解和视频一起看,希望对大家理解回溯算法有所帮助。
都知道n皇后问题是回溯算法解决的经典问题但是用回溯解决多了组合、切割、子集、排列问题之后遇到这种二矩阵还会有点不知所措。
都知道n皇后问题是回溯算法解决的经典问题但是用回溯解决多了组合、切割、子集、排列问题之后遇到这种二矩阵还会有点不知所措。
首先来看一下皇后们的约束条件:
@ -43,7 +43,7 @@ n 皇后问题 研究的是如何将 n 个皇后放置在 n×n 的棋盘上,
确定完约束条件,来看看究竟要怎么去搜索皇后们的位置,其实搜索皇后的位置,可以抽象为一棵树。
下面我用一个3 * 3 的棋,将搜索过程抽象为一颗树,如图:
下面我用一个 3 * 3 的棋,将搜索过程抽象为一颗树,如图:
![51.N皇后](https://img-blog.csdnimg.cn/20210130182532303.jpg)
@ -73,11 +73,11 @@ void backtracking(参数) {
我依然是定义全局变量二维数组result来记录最终结果。
参数n是棋的大小然后用row来记录当前遍历到棋盘的第几层了。
参数n是棋的大小然后用row来记录当前遍历到棋盘的第几层了。
代码如下:
```
```cpp
vector<vector<string>> result;
void backtracking(int n, int row, vector<string>& chessboard) {
```
@ -92,7 +92,7 @@ void backtracking(int n, int row, vector<string>& chessboard) {
代码如下:
```
```cpp
if (row == n) {
result.push_back(chessboard);
return;
@ -107,7 +107,7 @@ if (row == n) {
代码如下:
```
```cpp
for (int col = 0; col < n; col++) {
if (isValid(row, col, chessboard, n)) { // 验证合法就可以放
chessboard[row][col] = 'Q'; // 放置皇后
@ -117,7 +117,7 @@ for (int col = 0; col < n; col++) {
}
```
* 验证棋是否合法
* 验证棋是否合法
按照如下标准去重:
@ -163,7 +163,7 @@ class Solution {
private:
vector<vector<string>> result;
// n 为输入的棋盘大小
// row 是当前递归到棋的第几行了
// row 是当前递归到棋的第几行了
void backtracking(int n, int row, vector<string>& chessboard) {
if (row == n) {
result.push_back(chessboard);
@ -470,7 +470,56 @@ var solveNQueens = function(n) {
};
```
### Swift
```swift
func solveNQueens(_ n: Int) -> [[String]] {
var result = [[String]]()
// 棋盘使用Character的二维数组以便于更新元素
var chessboard = [[Character]](repeating: [Character](repeating: ".", count: n), count: n)
// 检查棋盘是否符合N皇后
func isVaild(row: Int, col: Int) -> Bool {
// 检查列
for i in 0 ..< row {
if chessboard[i][col] == "Q" { return false }
}
var i, j: Int
// 检查45度
i = row - 1
j = col - 1
while i >= 0, j >= 0 {
if chessboard[i][j] == "Q" { return false }
i -= 1
j -= 1
}
// 检查135度
i = row - 1
j = col + 1
while i >= 0, j < n {
if chessboard[i][j] == "Q" { return false }
i -= 1
j += 1
}
return true
}
func backtracking(row: Int) {
if row == n {
result.append(chessboard.map { String($0) })
}
for col in 0 ..< n {
guard isVaild(row: row, col: col) else { continue }
chessboard[row][col] = "Q" // 放置皇后
backtracking(row: row + 1)
chessboard[row][col] = "." // 回溯
}
}
backtracking(row: 0)
return result
}
```
-----------------------
<div align="center"><img src=https://code-thinking.cdn.bcebos.com/pics/01二维码一.jpg width=500> </img></div>