原题:
解决方法:
代码:
The n-queens puzzle is the problem of placing n queens on ann×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.
For example,
There exist two distinct solutions to the 4-queens puzzle:
[ [".Q..", // Solution 1 "...Q", "Q...", "..Q."], ["..Q.", // Solution 2 "Q...", "...Q", ".Q.."] ]
解决方法:
解题的基本思路是:用一个数组来保存queen所在位置的列号,数组的序号表示queen的行号。从一行开始,尝试着往里面放一个合法的列,如果可以,接着处理下一行,直到所有的结果求出。
- 首先需要一个判断列是否合理的函数,检查现有数组,列不能存在,同时新的列号行号与原来的不能在同一对角线上。
- 需要一个将数组转换成结果字符串的函数。
- 最后就是最主要的dfs函数了,处理好返回和循环。
代码:
vector<string> format(vector<int>& queens){
vector<string> res;
for(auto col: queens){
string line;
for(int i = 0; i < col; i++)
line.push_back('.');
line.push_back('Q');
for(int i = col + 1; i < queens.size(); i++)
line.push_back('.');
res.push_back(line);
}
return res;
}
bool isValid(vector<int>& queens, int row, int col){
for(int i = 0; i < queens.size(); i++){
if (queens[i] == -1)
continue;
if (queens[i] == col)
return false;
if (abs(i-row) == abs(col-queens[i]))
return false;
}
return true;
}
void dfs(vector<vector<string>>& res, vector<int> queens, int row, bool reset){
if (row >= queens.size()){
res.push_back(format(queens));
return;
}
for(int i = 0; i < queens.size();i++){
if (reset){
for(auto &p: queens)
p = -1;
}
if (isValid(queens, row, i)){
queens[row] = i;
dfs(res, queens, row + 1, false);
}
}
}
vector<vector<string>> solveNQueens(int n) {
vector<vector<string>> res;
vector<int> queens(n, -1);
dfs(res, queens, 0, true);
return res;
}