解法一:(基于集合的回溯)我们从第一行开始寻找,找每一行皇后应该放在第几列。每次找到都用Set记录已经用过的列和对角,其中从左到右向下的对角(行-列相同),右到左向下的对角(行+列相同)。
class Solution {
public List<List<String>> solveNQueens(int n) {
List<List<String>> result = new ArrayList<List<String>>();
int[] queue = new int[n];
Set<Integer> columes = new HashSet<>();
Set<Integer> diagonal1 = new HashSet<>();
Set<Integer> diagonal2 = new HashSet<>();
backtrace(result, queue, n, 0, columes, diagonal1, diagonal2);
return result;
}
public void backtrace(List result, int[] queue, int n, int row, Set columes, Set diagonal1, Set diagonal2){
if(row == n){
List<String> temp = generateResult(queue, n);
result.add(temp);
return;
}
for(int col=0; col<n; col++){
if(columes.contains(col)){
continue;
}
if(diagonal1.contains(row-col)){
continue;
}
if(diagonal2.contains(row+col)){
continue;
}
columes.add(col);
diagonal1.add(row-col);
diagonal2.add(row+col);
queue[row] = col;
backtrace(result, queue, n, row+1, columes, diagonal1, diagonal2);
columes.remove(col);
diagonal1.remove(row-col);
diagonal2.remove(row+col);
queue[row] = -1;
}
}
public List<String> generateResult(int[] queue, int n){
List<String> temp = new ArrayList<String>();
for(int i=0; i<n; i++){
char[] charTemp = new char[n];
Arrays.fill(charTemp, '.');
charTemp[queue[i]] = 'Q';
temp.add(new String(charTemp));
}
return temp;
}
}
注意:
queue[i]
表示第i行的皇后放在第queue[i]
列
- 从左到右向下的对角(行-列相同),右到左向下的对角(行+列相同)
Arrays.fill(charTemp, '.')
表示用 '.'
填充charTemp
数组