文章目录
解题思路:时间复杂度O(
N
!
N!
N!),空间复杂度O(
n
n
n) |
---|
- 用一个数组来表示每个皇后所在列数
- 而数组下标就是每个皇后所在行数。我们规定,第0个皇后就在第0行,第1个皇后就在第1行,所以只需要一个数组
- 那么我们想要安排一个新的皇后入棋牌时,要看看是否和前面的皇后冲突
- 如果和前面的皇后在同一列,就说明冲突
- 如果当前皇后想要插入的行和列,和前面皇后的行和列,在同一斜线,就说明冲突, 具体判断规则如下:
两个皇后的行数相减后的绝对值 = 列数相减后的绝对值,就说明两个皇后在一个对角线。因为棋牌是正方形的。也就是Math.abs(A.row - B.row) == Math.abs(A.column - B.column). A和B是两个皇后,row代表皇后所在行,column表示皇后所在列
class Solution {
List<List<String>> ans = new ArrayList<List<String>>();
int[] positions;
int n;
public List<List<String>> solveNQueens(int n) {
this.n = n;this.positions = new int[n];
backTracking(0);
return ans;
}
public void backTracking(int index){
if(index == n){
ArrayList<String> list = new ArrayList<>();
for(int column: positions){
char[] records = new char[n];
Arrays.fill(records,'.');
records[column] = 'Q';
list.add(new String(records));
}
ans.add(list);
}else{
for(int i = 0;i<n;i++){
if(isConflicted(positions,index,i)) continue;
positions[index] = i;
backTracking(index+1);
}
}
}
public boolean isConflicted(int[] positions,int index,int column){
for(int i = 0;i<index;i++){
if(column == positions[i]) return true;
if(Math.abs(index - i) == Math.abs(positions[i] - column)) return true;
}
return false;
}
}