按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。
n 皇后问题 研究的是如何将 n
个皇后放置在 n×n
的棋盘上,并且使皇后彼此之间不能相互攻击。
给你一个整数 n
,返回所有不同的 n 皇后问题 的解决方案。
每一种解法包含一个不同的 n 皇后问题 的棋子放置方案,该方案中 'Q'
和 '.'
分别代表了皇后和空位。
示例 1:
输入:n = 4 输出:[[".Q..","...Q","Q...","..Q."],["..Q.","Q...","...Q",".Q.."]] 解释:如上图所示,4 皇后问题存在两个不同的解法。
示例 2:
输入:n = 1 输出:[["Q"]]
提示:
1 <= n <= 9
思路:回溯法解决n后问题,在本问题中,我们定义一个函数判断这个位置的皇后是否满足,定义is_valid函数,其中我们分别遍历45度,列和135度的方向上是否有皇后,有则返回bool,否则返回true,至于为何我们不判断行方向的皇后,是因为我们在回溯时,当一个行的位置上放了一个皇后,那么直接跳到下一行放皇后,所以不需要担心行方向上有多个皇后。
class Solution {
public:
vector<vector<string>>res;
bool is_valid(int i,int j,int n,vector<string>& str)
{
for(int a=0;a<i;a++)
{
if(str[a][j]=='Q')
{
return false;
}
}
for(int a=i-1,b=j-1;a>=0&&b>=0;a--,b--)
{
if(str[a][b]=='Q')
{
return false;
}
}
for(int a=i-1,b=j+1;a>=0&&b<n;a--,b++)
{
if(str[a][b]=='Q')
{
return false;
}
}
return true;
}
void backtracing(int n,int index,vector<string>& str)
{
if(index==n)
{
res.push_back(str);
return ;
}
for(int i=0;i<n;i++)
{
if(is_valid(index,i,n,str))
{
str[index][i]='Q';
backtracing(n,index+1,str);
str[index][i]='.';
}
}
}
vector<vector<string>> solveNQueens(int n) {
vector<string>str(n,string(n,'.'));
backtracing(n,0,str);
return res;
}
};