use std::collections::{HashSet, VecDeque}; // 51. N-Queens, Hard // https://leetcode.com/problems/n-queens/ impl Solution { pub fn solve_n_queens(n: i32) -> Vec> { let mut board: Vec> = vec![vec![0; n as usize]; n as usize]; // Check if queen can be placed fn is_valid_placement(board: &Vec>, n: i32, i: i32, j: i32) -> bool { let mut queue = VecDeque::new(); queue.push_back((i, j, (1, 0))); queue.push_back((i, j, (1, 1))); queue.push_back((i, j, (0, 1))); queue.push_back((i, j, (-1, 1))); queue.push_back((i, j, (-1, 0))); queue.push_back((i, j, (-1, -1))); queue.push_back((i, j, (0, -1))); queue.push_back((i, j, (1, -1))); while !queue.is_empty() { let (x, y, direction) = queue.pop_front().unwrap(); if 0 <= x && x < n && 0 <= y && y < n { if board[x as usize][y as usize] == 1 { return false; } queue.push_back((x + direction.0, y + direction.1, direction)); } } true } let mut ans: Vec>> = vec![]; fn backtracking(ans: &mut Vec>>, board: &mut Vec>, n: usize, placed: usize, i: usize, j: usize) { if placed == n { ans.push(board.clone()); } else if i == n { } else if j == n { backtracking(ans, board, n, placed, i + 1, 0); } else { if is_valid_placement(board, n as i32, i as i32, j as i32) { board[i][j] = 1; backtracking(ans, board, n, placed + 1, i, j + 1); board[i][j] = 0; } backtracking(ans, board, n, placed, i, j + 1); } } backtracking(&mut ans, &mut board, n as usize, 0, 0, 0); ans.iter() .map(|ans| { ans.iter() .map(|row| row.iter().map(|ans| if *ans == 1 { "Q".to_string() } else { ".".to_string() }).collect::()) .collect() }) .collect() } } struct Solution {} #[cfg(test)] mod tests { use super::*; #[test] fn test_find_duplicates() { assert_eq!(Solution::solve_n_queens(4).len(), 2); } #[test] fn test_find_duplicates2() { assert_eq!(Solution::solve_n_queens(1).len(), 1); } }