版权声明: https://blog.csdn.net/Dorothy_Xue/article/details/84260174
题目描述:
n 皇后问题研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。
上图为 8 皇后问题的一种解法。
给定一个整数 n,返回所有不同的 n 皇后问题的解决方案。
每一种解法包含一个明确的 n 皇后问题的棋子放置方案,该方案中 'Q'
和 '.'
分别代表了皇后和空位。
示例:
输入: 4 输出: [ [".Q..", // 解法 1 "...Q", "Q...", "..Q."], ["..Q.", // 解法 2 "Q...", "...Q", ".Q.."] ] 解释: 4 皇后问题存在两个不同的解法。
方法:DFS
class Solution {
public:
vector<vector<string>> res;
vector<vector<string>> solveNQueens(int n) {
vector<string> flag(n,string(n,'.'));
queen(0,n,flag);
return res;
}
void queen(int row,int n,vector<string>& flag){
if(row==n) {
res.push_back(flag);
return;
}
for(int col=0;col<n;col++)
if(check(row,col,n,flag)){
flag[row][col]='Q';
queen(row+1,n,flag);
flag[row][col]='.';
}
}
bool check(int row,int col,int n,vector<string>& flag){
for(int t=0;t<row;t++)//判断列
if(flag[t][col]=='Q') return false;
for(int r=row-1,c=col-1;r>=0&&c>=0;r--,c--)//判断左上右下对角线
if(flag[r][c]=='Q') return false;
for(int r=row-1,c=col+1;r>=0&&c<n;r--,c++)//判断左下右上对角线
if(flag[r][c]=='Q') return false;
return true;
}
};
思路:
经典深搜,需要在判断时判断三种情况:
- 同一列有没有Queen
- 左上右下对角线有没有Queen
- 左下右上对角线有没有Queen
这里没有判断行,是因为设置Queen时是逐行的,一行设置一个,所以同一行不会存在多余一个的Queen。并且判断时只需要判断当前位置之前的三种情况,当前位置之后的不需要判断,因为还没设置呢。