LeetCode 51.N-Queens
LeetCode 51.N-Queens ()
题目
链接
https://leetcode-cn.com/problems/n-queens/
问题描述
n皇后问题研究的是如何将 n 个皇后放置在 n × n 的棋盘上,并且使皇后彼此之间不能相互攻击。
给定一个整数 n ,返回所有不同的 _n _皇后问题的解决方案。
每一种解法包含一个明确的 n 皇后问题的棋子放置方案,该方案中 Q 和 . 分别代表了皇后和空位。
示例
输入: 4
输出: [
[".Q..", // 解法 1
"...Q",
"Q...",
"..Q."],
["..Q.", // 解法 2
"Q...",
"...Q",
".Q.."]
]
解释: 4 皇后问题存在两个不同的解法。
提示
1 <= n <= 9
思路
这题的思路和之前的N皇后II一样,都是运用回溯法。
复杂度分析
时间复杂度 O(n!)
空间复杂度 O(n)
代码
Java
static List<List<String>> ans = new ArrayList<>();
static int[] queen;
public static List<List<String>> solveNQueens(int n) {
queen = new int[n];
place(0, n);
return ans;
}
public static List<String> getans(int n) {
List<String> tmp = new ArrayList<>();
for (int i = 0; i < n; i++) {
StringBuffer s = new StringBuffer();
for (int j = 0; j < queen[i]; j++) {
s.append(".");
}
s.append("Q");
for (int j = queen[i] + 1; j < n; j++) {
s.append(".");
}
tmp.add(s.toString());
}
return tmp;
}
public static void place(int t, int n) {
if (t == n) {
ans.add(getans(n));
return;
}
for (int i = 0; i < n; i++) {
if (check(t, i, n)) {
queen[t] = i;
place(t + 1, n);
queen[t] = 0;
}
}
}
public static boolean check(int t, int x, int n) {
for (int i = 0; i < t; i++) {
if (queen[i] == x || queen[i] == x - t + i || queen[i] == x + t - i) {
return false;
}
}
return true;
}