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