题目链接:https://leetcode.com/problems/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.
For example,
There exist two distinct solutions to the 4-queens puzzle:
[ [".Q..", // Solution 1 "...Q", "Q...", "..Q."], ["..Q.", // Solution 2 "Q...", "...Q", ".Q.."] ]
思路:经典八皇后问题. 还是一个DFS+回溯的问题. 每层搜索搜索枚举第i层的所有位置, 在决定这个位置是否可以放的时候我们需要看当前列是否有其他皇后, 当前位置的左斜线和右斜线是否有皇后, 如果有的话当前位置不能放, 都没有的话就可以放在这里, 并从当前位置进入下一次的搜索. 直到如果能够走到n层说明这是一个解, 就可以加入结果集合中.
代码如下:
class Solution {
public:
void DFS(vector<string>& map, int k, int n)
{
if(n == k) return result.push_back(map);
for(int i=0, y, x; i < n; i++)
{
for(y = 0; y < k; y++)
if(map[y][i] == 'Q') break;
if(y != k) continue;
for(x=i, y=k; x<n && y>=0; x++, y--)
if(map[y][x] == 'Q') break;
if(!(x==n || y<0)) continue;
for(x=i, y=k;x>=0 && y>=0; x--, y--)
if(map[y][x] == 'Q') break;
if(!(x < 0 || y < 0)) continue;
map[k][i] = 'Q';
DFS(map, k+1, n);
map[k][i] = '.';
}
}
vector<vector<string>> solveNQueens(int n) {
if(n<=0) return {};
vector<string> map(n, string(n, '.'));
DFS(map, 0, n);
return result;
}
private:
vector<vector<string>> result;
};