🔗 leetcode.cn/problems/n-…
题目
- 给 n 个皇后,放在 N * N 的棋盘上,使得皇后之间不可以互相攻击,返回所有的棋盘摆放
- 皇后可以攻击同行、同列、同斜线的位置
思路
- 回溯,每次枚举某一行可以放皇后的位置,直到全部枚举完,把过程中皇后摆放的位置进行记录
- 皇后可以放的位置检查:某列 col 是否摆放过,i+1 j+1 斜线 是否摆放过,判断 n + col - row 即可, i+1 j -1 斜线是否摆放过,判断 col + row 即可
- 检查到合适位置,递归摆放下一行
- 递归完成,reset 这一次摆放
代码
class Solution {
public:
bool col[20], xx[20], yy[20]
vector<vector<string>> ans
void dfs(int n, int row, vector<string>& tmp) {
if (row == n) {
ans.push_back(tmp)
return
}
for (int i = 0
if (col[i] == false && xx[i - row + n] == false &&
yy[row + i] == false) {
col[i] = true
xx[i - row + n] = true
yy[row + i] = true
string st
for (int j = 0
if (i == j)
st += 'Q'
else
st += '.'
}
tmp.push_back(st)
dfs(n, row + 1, tmp)
col[i] = false
xx[i - row + n] = false
yy[row + i] = false
tmp.pop_back()
}
}
}
vector<vector<string>> solveNQueens(int n) {
memset(col, 0, sizeof col)
memset(xx, 0, sizeof xx)
memset(yy, 0, sizeof yy)
vector<string> tmp
dfs(n, 0, tmp)
return ans
}
}