N皇后
Leetcode51. N 皇后
Leetcode52. N皇后 II
示例
输入:4
输出:[
[".Q..", // 解法 1
"...Q",
"Q...",
"..Q."],
["..Q.", // 解法 2
"Q...",
"...Q",
".Q.."]
]
解释: 4 皇后问题存在两个不同的解法。
解法
- 皇后的限制条件:皇后彼此之间不能相互攻击-->皇后们不能在同一行、同一列、斜对角-->需要一个函数来判断当前皇后位置是否合理
bool isValid()
- 回溯算法,一行一行放置皇后,每行放置前调用isValid 函数来判断皇后放置的位置
- 因此 isValid 函数需要输入 当前行、当前列、已摆放的皇后位置
bool isValid(int n, int row, int col, vector<string>& state){
//同一列
for(int i=0; i<row; ++i){
if(state[i][col] == 'Q') return false;
}
//斜向左
for(int i=row-1, j=col-1; i>=0 && j>=0; --i, --j){
if(state[i][j] == 'Q') return false;
}
//斜向右
for(int i=row-1, j=col+1; i>=0 && j<n; --i, ++j){
if(state[i][j] == 'Q') return false;
}
return true;
}
总的:
class Solution {
public:
vector<vector<string>> solveNQueens(int n) {
vector<vector<string>> ans;
vector<string> tmp(n, string(n, '.'));
dfs(n, 0, tmp, ans);
return ans;
}
void dfs(int n, int row, vector<string>& state, vector<vector<string>>& ans){
//到头,结束
if(row==n){
ans.push_back(state);
return;
}
//当前行按列搜索
for(int i=0; i<n; ++i){
if(!isValid(n, row, i, state)) continue;
state[row][i] = 'Q';
dfs(n, row+1, state, ans);
state[row][i] = '.';
}
}
bool isValid(int n, int row, int col, vector<string>& state){
//同一列
for(int i=0; i<row; ++i){
if(state[i][col] == 'Q') return false;
}
//斜向左
for(int i=row-1, j=col-1; i>=0 && j>=0; --i, --j){
if(state[i][j] == 'Q') return false;
}
//斜向右
for(int i=row-1, j=col+1; i>=0 && j<n; --i, ++j){
if(state[i][j] == 'Q') return false;
}
return true;
}
};