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

上图为 8 皇后问题的一种解法。
给定一个整数 n,返回所有不同的 n 皇后问题的解决方案。
每一种解法包含一个明确的 n 皇后问题的棋子放置方案,该方案中 ‘Q’ 和 ‘.’ 分别代表了皇后和空位。
示例:
输入:4
输出:[
[".Q..", // 解法 1
"...Q",
"Q...",
"..Q."],
["..Q.", // 解法 2
"Q...",
"...Q",
".Q.."]
]
解释: 4 皇后问题存在两个不同的解法。
提示:
- 皇后彼此不能相互攻击,也就是说:任何两个皇后都不能处于同一条横行、纵行或斜线上。
来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/n-queens 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
Solution 1
递归回溯
import java.util.*;
class Solution {
int boardLen;
List<List<String>> boards;
List<StringBuilder> board;
List<Boolean> row;
List<Boolean> column;
List<Boolean> slash;
List<Boolean> backslash;
public void recursiveFind(int n) {
if (n == 0) {
List<String> temp = new ArrayList<>();
for (StringBuilder s : board) {
temp.add(s.toString());
}
boards.add(temp);
return;
}
int i = boardLen - n;
for (int j = 0; j < boardLen; j++) {
if (row.get(i) == false && column.get(j) == false && slash.get(i + j) == false
&& backslash.get(i + boardLen - 1 - j) == false) {
//
row.set(i, true);
column.set(j, true);
slash.set(i + j, true);
backslash.set(i + boardLen - 1 - j, true);
board.get(i).setCharAt(j, 'Q');
//
recursiveFind(n - 1);
//
row.set(i, false);
column.set(j, false);
slash.set(i + j, false);
backslash.set(i + boardLen - 1 - j, false);
board.get(i).setCharAt(j, '.');
}
}
}
public List<List<String>> solveNQueens(int n) {
boardLen = n;
boards = new ArrayList<>();
board = new ArrayList<>();
row = new ArrayList<>();
column = new ArrayList<>();
slash = new ArrayList<>();
backslash = new ArrayList<>();
initBoard();
recursiveFind(n);
return boards;
}
public void initBoard() {
for (int i = 0; i < boardLen; i++) {
StringBuilder s = new StringBuilder();
for (int j = 0; j < boardLen; j++) {
s.append('.');
}
board.add(s);
}
for (int i = 0; i < boardLen; i++) {
row.add(false);
}
for (int i = 0; i < boardLen; i++) {
column.add(false);
}
for (int i = 0; i < boardLen * 2 - 1; i++) {
slash.add(false);
}
for (int i = 0; i < boardLen * 2 - 1; i++) {
backslash.add(false);
}
}
}