N-Queens
The n-queens puzzle is the problem of placing n queens on an n×n chessboard such that no two queens attack each other.
Given an integer n, return all distinct solutions to the n-queens puzzle.
Each solution contains a distinct board configuration of the n-queens’ placement, where ‘Q’ and ‘.’ both indicate a queen and an empty space respectively.
Example:
Input: 4
Output: [
[".Q…", // Solution 1
“…Q”,
“Q…”,
“…Q.”],
["…Q.", // Solution 2
“Q…”,
“…Q”,
“.Q…”]
]
Explanation: There exist two distinct solutions to the 4-queens puzzle as shown above.
解析
求解n皇后问题,使用回溯的方法。
解法1
class Solution {
public:
vector<vector<string>> solveNQueens(int n) {
string s = "";
for(int i=0;i<n;i++)
s += '.';
vector<string> solution(n, s);
vector<vector<string> > res;
NQueens(res, solution, 0, n);
return res;
}
void NQueens(vector<vector<string>>& res, vector<string> solution, int row, int n){
if(row == n){
res.push_back(solution);
return;
}
for(int i=0;i<n;i++){
if(isvalid(solution, row, i, n)){
solution[row][i] = 'Q';
NQueens(res, solution, row+1, n);
solution[row][i] = '.';
}
}
}
bool isvalid(vector<string>& solution, int row, int col,int n){
for(int i=0;i<row;i++)
if(solution[i][col] == 'Q')
return false;
for(int i=row-1,j=col+1;i>=0 && j<n;i--,j++)
if(solution[i][j] == 'Q')
return false;
for(int i=row-1,j=col-1;i>=0 && j>=0;i--,j--)
if(solution[i][j] == 'Q')
return false;
return true;
}
};
解法2
用一个pos的n维数组来保存第i行皇后在哪一列,冲突时只要判断是否有同一列或者行列差值相等就行。
class Solution {
public:
vector<vector<string> > solveNQueens(int n) {
vector<vector<string> > res;
vector<int> pos(n, -1);
solveNQueensDFS(pos, 0, res);
return res;
}
void solveNQueensDFS(vector<int> &pos, int row, vector<vector<string> > &res) {
int n = pos.size();
if (row == n) {
vector<string> out(n, string(n, '.'));
for (int i = 0; i < n; ++i) {
out[i][pos[i]] = 'Q';
}
res.push_back(out);
}
else {
for (int col = 0; col < n; ++col) {
if (isValid(pos, row ,col)) {
pos[row] = col;
solveNQueensDFS(pos, row + 1, res);
pos[row] = -1;
}
}
}
}
bool isValid(vector<int> &pos, int row, int col) {
for (int i = 0; i < row; ++i) {
if (col == pos[i] || abs(row - i) == abs(col - pos[i])) {
return false;
}
}
return true;
}
};
求N皇后解的个数
在上面的代码上稍微修改就行了
class Solution {
public:
int totalNQueens(int n) {
int res = 0;
vector<int> pos(n, -1);
solveNQueensDFS(pos, 0, res);
return res;
}
void solveNQueensDFS(vector<int> &pos, int row, int &res) {
int n = pos.size();
if (row == n) {
res ++;
}
else {
for (int col = 0; col < n; ++col) {
if (isValid(pos, row ,col)) {
pos[row] = col;
solveNQueensDFS(pos, row + 1, res);
pos[row] = -1;
}
}
}
}
bool isValid(vector<int> &pos, int row, int col) {
for (int i = 0; i < row; ++i) {
if (col == pos[i] || abs(row - i) == abs(col - pos[i])) {
return false;
}
}
return true;
}
};