51. N-Queens问题,主要是在使用dfs方法考虑。按照行搜索的方式来对列,主、副对角线来进行查找,分析是否有可以相互攻击的元素
java
class Solution {
public List<List<String>> solveNQueens(int n) {
List<List<String>> result = new ArrayList<>();
if (n <= 0) {
return result;
}
dfs(new boolean[n], new boolean[2 * n], new boolean[2 * n], 0, n, new ArrayList<String>(), result);
return result;
}
private void dfs(boolean[] shu,
boolean[] pie,
boolean[] na,
int row,
int n,
List<String> path,
List<List<String>> result) {
if (row == n) {
result.add(new ArrayList<String>(path));
return;
}
for (int col = 0; col < n; col++) {
int id1 = row + col;
int id2 = n + col - row;
if (shu[col] || pie[id1] || na[id2]) {
continue;
}
char[] arr = new char[n];
Arrays.fill(arr, '.');
arr[col] = 'Q';
shu[col] = true;
pie[id1] = true;
na[id2] = true;
path.add(new String(arr));
dfs(shu, pie, na, row + 1, n, path, result);
path.remove(path.size() - 1);
na[id2] = false;
pie[id1] = false;
shu[col] = false;
}
}
}
python
class Solution(object):
def solveNQueens(self, n):
"""
:type n: int
:rtype: List[List[str]]
"""
if n <= 0:
return []
result = []
self.dfs([False] * n, [False] * n * 2, [False] * n * 2, 0, n, [], result)
return result
def dfs(self, shu, pie, na, row, n, path, result):
if row == n:
result.append(path[:])
return
for col in range(n):
id1, id2 = col + row, n + col - row
if shu[col] or pie[id1] or na[id2]:
continue
arr = ['.'] * n
arr[col] = 'Q'
shu[col], pie[id1], na[id2] = True, True, True
path.append("".join(arr))
self.dfs(shu, pie, na, row + 1, n, path, result)
path.pop()
shu[col], pie[id1], na[id2] = False, False, False