leet-code/src/main/java/leetcode/editor/cn/NQueens.java
huangge1199@hotmail.com 5305a29789 51:N 皇后
2021-08-02 18:27:21 +08:00

125 lines
3.2 KiB
Java
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

//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
// 皇后彼此不能相互攻击,也就是说:任何两个皇后都不能处于同一条横行、纵行或斜线上。
//
//
//
// Related Topics 数组 回溯
// 👍 957 👎 0
package leetcode.editor.cn;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
//51:N 皇后
public class NQueens {
public static void main(String[] args) {
//测试代码
Solution solution = new NQueens().new Solution();
solution.solveNQueens(4);
}
//力扣代码
//leetcode submit region begin(Prohibit modification and deletion)
class Solution {
List<List<String>> result = new ArrayList<>();
public List<List<String>> solveNQueens(int n) {
StringBuilder str = new StringBuilder();
for (int i = 0; i < n; i++) {
str.append(".");
}
List<String> list = new ArrayList<>();
for (int i = 0; i < n; i++) {
list.add(str.toString());
}
bfs(list, n, 0);
return result;
}
private void bfs(List<String> list, int n, int row) {
if (row == list.size()) {
result.add(new ArrayList<>(list));
return;
}
for (int col = 0; col < n; col++) {
if (!isValid(list, row, col)) {
continue;
}
String temp = list.get(row);
temp = temp.substring(0, col) + "Q" + temp.substring(col + 1);
list.set(row,temp);
bfs(list, n, row + 1);
temp = temp.substring(0, col) + "." + temp.substring(col + 1);
list.set(row,temp);
}
}
private boolean isValid(List<String> list, int row, int col) {
int n = list.size();
for (String s : list) {
if (s.charAt(col) == 'Q') {
return false;
}
}
int r = row - 1;
int c = col + 1;
while (r >= 0 && c < n) {
if (list.get(r).charAt(c) == 'Q') {
return false;
}
r--;
c++;
}
r = row - 1;
c = col - 1;
while (r >= 0 && c >= 0) {
if (list.get(r).charAt(c) == 'Q') {
return false;
}
r--;
c--;
}
return true;
}
}
//leetcode submit region end(Prohibit modification and deletion)
}