1+
2+ impl Solution {
3+
4+ pub fn solve_n_queens ( n : i32 ) -> Vec < Vec < String > > {
5+
6+ let mut chessboard: Vec < Vec < i8 > > = vec ! [ vec![ 0 ; n as usize ] ; n as usize ] ;
7+ let mut result: Vec < Vec < String > > = Vec :: new ( ) ;
8+ let directions: Vec < ( isize , isize ) > = vec ! ( ( -1 , 1 ) , ( 1 , 1 ) , ( 1 , -1 ) , ( -1 , -1 ) ) ;
9+
10+ fn toggle_queen ( row : usize , col : usize , chessboard : & mut Vec < Vec < i8 > > , directions : & Vec < ( isize , isize ) > , toggle : i8 ) {
11+
12+ for i in 0 ..chessboard. len ( ) { chessboard[ row] [ i] += toggle } ;
13+ for j in 0 ..chessboard. len ( ) { chessboard[ j] [ col] += toggle } ;
14+
15+ for dir in directions {
16+ let mut i = row as isize + dir. 0 ;
17+ let mut j = col as isize + dir. 1 ;
18+ while i >= 0 && i < chessboard. len ( ) as isize && j >= 0 && j < chessboard. len ( ) as isize {
19+ chessboard[ i as usize ] [ j as usize ] += toggle;
20+ i += dir. 0 ;
21+ j += dir. 1 ;
22+ }
23+ }
24+ chessboard[ row] [ col] -= 3 * toggle;
25+ }
26+
27+ fn copy_board ( chessboard : & Vec < Vec < i8 > > ) -> Vec < String > {
28+ let mut copy: Vec < char > = vec ! [ '.' ; chessboard. len( ) ] ;
29+ let mut board: Vec < String > = Vec :: with_capacity ( chessboard. len ( ) ) ;
30+ for i in 0 ..chessboard. len ( ) {
31+ for j in 0 ..chessboard. len ( ) {
32+ if chessboard[ i] [ j] == -1 { copy[ j] = 'Q' } else { copy[ j] = '.' } ;
33+ }
34+ board. push ( copy. iter ( ) . collect ( ) ) ;
35+ }
36+ return board;
37+ }
38+
39+ fn backtrack ( chessboard : & mut Vec < Vec < i8 > > , result : & mut Vec < Vec < String > > , row : usize , directions : & Vec < ( isize , isize ) > ) {
40+ if row == chessboard. len ( ) {
41+ result. push ( copy_board ( & chessboard) ) ;
42+ return ;
43+ }
44+
45+ for col in 0 ..chessboard. len ( ) {
46+ if chessboard[ row] [ col] == 0 {
47+ toggle_queen ( row, col, chessboard, directions, 1 ) ;
48+ backtrack ( chessboard, result, row + 1 , directions) ;
49+ toggle_queen ( row, col, chessboard, directions, -1 ) ;
50+ }
51+ }
52+ return ;
53+ }
54+
55+
56+ backtrack ( & mut chessboard, & mut result, 0 , & directions) ;
57+ return result;
58+ }
59+ }
0 commit comments