n 皇后问题研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。

给定一个整数 n,返回所有不同的 n 皇后问题的解决方案。
每一种解法包含一个明确的 n 皇后问题的棋子放置方案,该方案中 'Q' 和 '.' 分别代表了皇后和空位。
示例:
输入: 4
输出: [
[".Q..", // 解法 1
"...Q",
"Q...",
"..Q."],
["..Q.", // 解法 2
"Q...",
"...Q",
".Q.."]
]
解释: 4 皇后问题存在两个不同的解法。
PS:字节跳动笔试的时候也遇到了这个题.这里做个笔记.
public class Solution {
private static final String QUEEN = "Q";
private static final String SPACE = ".";
List<List<String>> results = new ArrayList<>();
public List<List<String>> solveNQueens(int n) {
/**
* chess[row] = col, 表示在第row行,第col列放置一个皇后
*/
int chess[] = new int[n];
putRow(chess, 0, n);
return results;
}
private void putRow(int chess[], int row, int n) {
/**
* 表示最后一行已放了皇后,是一种解法.
*/
if (row == n) {
results.add(parseChess(chess, n));
return;
}
/**
* 构造一个bool数组来标记当前row中那些列不可用
*/
boolean cols[] = new boolean[n];
for (int i = 0; i < row; i++) {
int col = chess[i];
cols[col] = true;
int distance = row - i;
if (col - distance >= 0) cols[col - distance] = true;
if (col + distance < n) cols[col + distance] = true;
}
for (int col = 0; col < n; col++) {
if (cols[col]) continue;
chess[row] = col;
putRow(chess, row + 1, n);
}
}
/**
* 将一维数组解析为题目的格式.
* @param chess
* @param length
* @return
*/
private List<String> parseChess(int chess[], int length) {
List<String> result = new ArrayList<>();
for (int row = 0; row < length; row++) {
StringBuilder sb = new StringBuilder();
int col = chess[row];
for (int i = 0; i < length; i++) {
if (i == col) {
sb.append(QUEEN);
} else {
sb.append(SPACE);
}
}
result.add(sb.toString());
}
return result;
}
}