解法一:(基于集合的回溯)我们从第一行开始寻找,找每一行皇后应该放在第几列。每次找到都用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
数组