java数据结构与算法刷题目录(剑指Offer、LeetCode、ACM)-----主目录-----持续更新(进不去说明我没写完):https://blog.csdn.net/grd_java/article/details/123063846
文章目录
解题思路:时间复杂度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 ;
}
}