【leetcode】N皇后 回溯法c++
目录
51.N皇后
52.N皇后II
51.N皇后
51. N 皇后 - 力扣(LeetCode)
按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。
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
class Solution {
private:
bool isValid(vector<string>& board,int row,int col,int n)
{
for(int i=row-1;i>=0;i--)//同一列
{
if(board[i][col]=='Q') return false;
}
for(int i=row-1,j=col-1;i>=0&&j>=0;i--,j--)//左上
{
if(board[i][j]=='Q') return false;
}
for(int i=row-1,j=col+1;i>=0&&j<n;i--,j++)//右上
{
if(board[i][j]=='Q') return false;
}
return true;
}
void backtrack(vector<vector<string>>& result,vector<string>& board,int row,int n)
{
if(row==n)//row从0开始,到n-1时已经将n个皇后放置好
{
result.push_back(board);
return;
}
for(int col=0;col<n;col++)
{
if(isValid(board,row,col,n))
{
board[row][col]='Q';//放置皇后
backtrack(result,board,row+1,n);//放置下一行的皇后
board[row][col]='.';// 回溯
}
}
}
public:
vector<vector<string>> solveNQueens(int n) {
vector<vector<string>> result;
vector<string> board(n,string(n,'.'));
//初始化棋盘将n*n的棋盘全放置.表示还未放置皇后
backtrack(result,board,0,n);
return result;
}
};
52.N皇后II
52. N 皇后 II - 力扣(LeetCode)
返回 n 皇后问题 不同的解决方案的数量。
注意指针的用法
class Solution {
private:
bool isValid(vector<string>& board,int row,int col,int n)
{
for(int i=row-1;i>=0;i--)//同一列
{
if(board[i][col]=='Q') return false;
}
for(int i=row-1,j=col-1;i>=0&&j>=0;i--,j--)//左上
{
if(board[i][j]=='Q') return false;
}
for(int i=row-1,j=col+1;i>=0&&j<n;i--,j++)//右上
{
if(board[i][j]=='Q') return false;
}
return true;
}
void backtract(int* count,vector<string>& board,int row,int n)
{
if(row==n)
{
(*count)++;//注意指针的用法,*p取值,p表示的是地址
}
for(int col=0;col<n;col++)
{
if(isValid(board,row,col,n))
{
board[row][col]='Q';
backtract(count,board,row+1,n);
board[row][col]='.';
}
}
}
public:
int totalNQueens(int n) {
int count=0;
vector<string> board(n,string(n,'.'));
backtract(&count,board,0,n);
//注意传&count,如果直接传count,函数返回时count的值不会改变
return count;
}
};