|
1 | 1 | __________________________________________________________________________________________________
|
| 2 | +//runtime: 4ms, memory: 2.2MB |
2 | 3 |
|
| 4 | +impl Solution { |
| 5 | + pub fn solve_n_queens(n: i32) -> Vec<Vec<String>> { |
| 6 | + let mut board = vec![vec!['.'; n as usize]; n as usize]; |
| 7 | + let mut solution = vec![]; |
| 8 | + backtrack(&mut board, &mut solution, n, 0); |
| 9 | + solution |
| 10 | + } |
| 11 | +} |
| 12 | + |
| 13 | +fn backtrack(board: &mut Vec<Vec<char>>, solution: &mut Vec<Vec<String>>, n:i32, row: i32) { |
| 14 | + for column in 0..n { |
| 15 | + if !collision(&board, n, row, column) { |
| 16 | + board[row as usize][column as usize] = 'Q'; |
| 17 | + if row == n - 1 { |
| 18 | + solution.push(board.iter().map(|vec| vec.iter().collect()).collect()); |
| 19 | + } else { |
| 20 | + backtrack(board, solution, n, row + 1); |
| 21 | + } |
| 22 | + board[row as usize][column as usize] = '.'; |
| 23 | + } |
| 24 | + } |
| 25 | +} |
| 26 | + |
| 27 | +fn collision(board: &Vec<Vec<char>>, n: i32, row: i32, column: i32) ->bool { |
| 28 | + let mut up_row = row - 1; |
| 29 | + let mut left_column = column - 1; |
| 30 | + let mut right_column = column + 1; |
| 31 | + while up_row >= 0 { |
| 32 | + if board[up_row as usize][column as usize] == 'Q' { |
| 33 | + return true; |
| 34 | + } |
| 35 | + if left_column >= 0 && board[up_row as usize][left_column as usize] == 'Q' { |
| 36 | + return true; |
| 37 | + } |
| 38 | + if right_column < n && board[up_row as usize][right_column as usize] == 'Q' { |
| 39 | + return true; |
| 40 | + } |
| 41 | + up_row -= 1; |
| 42 | + left_column -= 1; |
| 43 | + right_column += 1; |
| 44 | + } |
| 45 | + false |
| 46 | +} |
3 | 47 | __________________________________________________________________________________________________
|
4 | 48 |
|
5 | 49 | __________________________________________________________________________________________________
|
0 commit comments