题目:51. N 皇后
思路:回溯
用一个n维数组存储皇后位置,数组索引表示皇后所在的行,索引处存的是皇后所在的列,这样很容易保证皇后不在同一行和列,同时需要保证对角线不重复:
两个点(i,j)(k,l):
观察数组不难发现,若两点在斜对角,有i + j == k + l
、i - j == k - l
,推导可得:
i - k == l - j
、i - k == j - l
代码:
class Solution {
public List<List<String>> solveNQueens(int n) {
int[] queen = new int[n];
Arrays.fill(queen, 0);
List<List<String>> res = new ArrayList<List<String>>();
backtrack(res, queen, 0, n);
return res;
}
public void backtrack(List<List<String>> res, int[] queen, int cur, int N) {
if (cur >= N) {
List<String> temp = new ArrayList<>();
for(int i = 0; i < N; i++) {
char[] array = new char[N];
Arrays.fill(array, '.');
array[queen[i]] = 'Q';
temp.add(new String(array));
}
res.add(temp);
}
for (int i = 0; i < N; i ++) {
if (canPlace(queen, cur, i)) {
queen[cur] = i;
backtrack(res, queen, cur + 1, N);
queen[cur] = 0;
}
}
}
public boolean canPlace(int[] queen, int index, int k) {
for (int i = 0; i < index; i++) {
if (queen[i] == k || Math.abs(i - index) == Math.abs(queen[i] - k)) {
return false;
}
}
return true;
}
}