[−][src]Function leetcode_for_rust::cd0052_n_queens_ii::total_n_queens
pub fn total_n_queens(n: i32) -> i32
Solutions
Approach 1: DFS
-
Time complexity:
-
Space complexity:
-
Runtime: 4 ms
-
Memory: 2.8 MB
impl Solution { pub fn total_n_queens(n: i32) -> i32 { if n < 1 { return 0; } let mut result = 0; let mut cols = vec![]; let mut xy_sum = vec![]; let mut xy_sub = vec![]; let row = 0; Self::_dfs(n, &mut result, row, &mut cols, &mut xy_sum, &mut xy_sub); result } pub fn _dfs(n: i32, result: &mut i32, row: i32, cols: &mut Vec<i32>, xy_sum: &mut Vec<i32>, xy_sub: &mut Vec<i32>) { if row >= n { *result += 1; return; } for col in 0..n { if cols.contains(&col) || xy_sum.contains(&(row + col)) || xy_sub.contains(&(row - col)) { continue; } cols.push(col); xy_sum.push(row + col); xy_sub.push(row - col); Self::_dfs(n, result, row + 1, cols, xy_sum, xy_sub); cols.retain(|&x| x != col); xy_sum.retain(|&x| x != (row + col)); xy_sub.retain(|&x| x != (row - col)); } } }
Approach 2: DFS
-
Time complexity:
-
Space complexity:
-
Runtime: 0 ms
-
Memory: 2.8 MB
impl Solution { pub fn total_n_queens(n: i32) -> Vec<Vec<String>> { let mut board = vec![vec!['.'; n as usize]; n as usize]; let mut num = 0; Self::schedule_queens(&mut board, &mut num, n as usize, 0); solution } fn schedule_queens(board: &mut Vec<Vec<char>>, num &mut i32, len: usize, row: usize) { for col in 0..len { if !Self::collision(&board, len, row, col) { board[row][col] = 'Q'; if row == len - 1 { *num += 1; } else { Self::schedule_queens(board, solution, len, row+1); } board[row][col] = '.'; } } } #[inline(always)] fn collision(board: &Vec<Vec<char>>, len: usize, row: usize, col: usize) -> bool { for i in 0..row { if board[i][col] == 'Q' { return true } } let (mut i, mut j) = (row as i32 - 1, col as i32 - 1); while i >= 0 && j >= 0 { if board[i as usize][j as usize] == 'Q' { return true } i -= 1; j -= 1; } let (mut i, mut j) = (row as i32 - 1, col as i32 + 1); while i >= 0 && j < len as i32 { if board[i as usize][j as usize] == 'Q' { return true} i -= 1; j += 1; } false } }
Approach 3: BitWise
-
Time complexity:
-
Space complexity:
-
Runtime: 0 ms
-
Memory: 2.3 MB
impl Solution { pub fn total_n_queens(n: i32) -> i32 { if n < 1 { return 0; } let mut result = 0; Self::_dfs(n, &mut result, 0, 0, 0, 0); result } pub fn _dfs(n: i32, result: &mut i32, row: i32, col: i32, pie: i32, na: i32) { if row >= n { *result += 1; return; } let mut bits = (!(col | pie | na)) & ((1 << n) - 1); while bits != 0 { let p = bits & -bits; Self::_dfs(n, result, row + 1, col | p, (pie | p) << 1, (na | p) >> 1); bits = bits & (bits - 1); } }
Reference