Leetcode51
链接:力扣 。
题目:
n 皇后问题 研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。
给你一个整数 n ,返回所有不同的 n 皇后问题 的解决方案。
每一种解法包含一个不同的 n 皇后问题 的棋子放置方案,该方案中 'Q' 和 '.' 分别代表了皇后和空位。
示例1:
输入:n = 4
输出:[[".Q..","...Q","Q...","..Q."],["..Q.","Q...","...Q",".Q.."]]
解释:4 皇后问题存在两个不同的解法。
示例2:
输入:n = 1
输出:[["Q"]]
思路:
经典问题N皇后,存在多种解法。这里采用全排列的思路来解决N皇后问题,思路可参考 《算法笔记》读书记录DAY_3_索多玛底层魔怔人的博客-CSDN博客 。
参考代码:
class Solution {
public:
vector<vector<string>> result;
bool hash[10] = {false};
void dfs(int p[], int &n, int index) {
if (index == n) {
vector<string> tmp;
for (int i = 0; i < n; i++) {
string str(n, '.');
str[p[i]] = 'Q';
tmp.push_back(str);
}
result.push_back(tmp);
return;
}
for (int i = 0; i < n; i++) {
if (hash[i] == false) {
bool flag = true;
for (int pre = 0; pre < index; pre++) {
if (index - pre == abs(i - p[pre])) {
flag = false;
break;
}
}
if (flag) {
p[index] = i;
hash[i] = true;
dfs(p, n, index + 1);
hash[i] = false;
}
}
}
}
vector<vector<string>> solveNQueens(int n) {
int *p = new int[n];
dfs(p, n, 0);
return result;
}
};