按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。
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
mp < rowSize && jTmp >= 0) {
if (iTmp == mTarget && jTmp == nTarget) {
return false;
}
iTmp++;
jTmp--;
}
//-1,+1
iTmp = isrc - 1;
jTmp = jsrc + 1;
while (iTmp >= 0 && jTmp < colSize) {
if (iTmp == mTarget && jTmp == nTarget) {
return false;
}
iTmp--;
jTmp++;
}
//-1,-1
iTmp = isrc - 1;
jTmp = jsrc - 1;
while (iTmp >= 0 && jTmp >= 0) {
if (iTmp == mTarget && jTmp == nTarget) {
return false;
}
iTmp--;
jTmp--;
}
return true;
}
bool isCheck(vector
for (int i = 0; i < visited.size(); i++) {
for (int j = 0; j < visited[0].size(); j++) {
if (false == visited[i][j]) {
continue;
}
if (i == row || j == col) {
return false;
}
if (isVisited(visited.size(), visited[0].size(), i, j, row,
col) == false) {
return false;
}
}
}
return true;
}
void backTrack(int n, int row, vector
if (row >= n) {
vector
for (int i = 0; i < n; i++) {
string str = "";
for (int j = 0; j < n; j++) {
if (visited[i][j] == true) {
str += "Q";
} else {
str += ".";
}
}
vec.push_back(str);
}
ret.push_back(vec);
return;
}
for (int i = 0; i < n; i++) {
if (visited[row][i] == true) {
continue;
}
if (isCheck(visited, row, i) == false) {
continue;
}
visited[row][i] = true;
backTrack(n, row + 1, visited);
visited[row][i] = false;
}
}
vector
vector
backTrack(n, 0, visited);
return ret;
}