/// 1861. Rotating the Box (Medium) /// /// You are given an m x n matrix of characters box representing a side-view of /// a box. Each cell of the box is one of the following: /// /// * A stone '#' /// * A stationary obstacle '*' /// * Empty '.' /// /// The box is rotated *90 degrees clockwise*, causing some of the stones to /// fall due to gravity. Each stone falls down until it lands on an obstacle, /// another stone, or the bottom of the box. Gravity *does not* affect the /// obstacles' positions, and the inertia from the box's rotation *does not /// *affect the stones' horizontal positions. /// /// It is *guaranteed* that each stone in box rests on an obstacle, another /// stone, or the bottom of the box. /// /// Return an n x m matrix representing the box after the rotation described /// above. /// /// *Example 1:* /// /// *Input:* box = [["#",".","#"]] /// *Output:* [["."], ///   ["#"], ///   ["#"]] /// /// *Example 2:* /// /// *Input:* box = [["#",".","*","."], ///   ["#","#","*","."]] /// *Output:* [["#","."], ///   ["#","#"], ///   ["*","*"], ///   [".","."]] /// /// *Example 3:* /// /// *Input:* box = [["#","#","*",".","*","."], ///   ["#","#","#","*",".","."], ///   ["#","#","#",".","#","."]] /// *Output:* [[".","#","#"], ///   [".","#","#"], ///   ["#","#","*"], ///   ["#","*","."], ///   ["#",".","*"], ///   ["#",".","."]] /// /// *Constraints:* /// /// * m == box.length /// * n == box[i].length /// * 1 <= m, n <= 500 /// * box[i][j] is either '#', '*', or '.'. /// use leetcode::*; struct Solution {} impl Solution { pub fn rotate_the_box(in_box: Vec>) -> Vec> { let n = in_box.len(); let m = in_box[0].len(); let mut out_box = vec![vec!['.'; n]; m]; for x in (0..n).rev() { let mut last = m - 1; for y in (0..m).rev() { let c = in_box[n - 1 - x][y]; if c == '*' { out_box[y][x] = '*'; if y > 0 { last = y - 1; } } else if c == '#' { out_box[last][x] = '#'; last = last.saturating_sub(1); } } } out_box } } pub fn main() { println!("{:?}", Solution::rotate_the_box(arg_into(1))); } #[cfg(test)] mod tests { use crate::Solution; use leetcode::vvc; #[test] fn test() { assert_eq!( Solution::rotate_the_box(vvc("[[#,.,#]]")), vvc("[[.],[#],[#]]") ); assert_eq!( Solution::rotate_the_box(vvc("[[#,.,*,.],[#,#,*,.]]")), vvc("[[#,.],[#,#],[*,*],[.,.]]") ); assert_eq!( Solution::rotate_the_box(vvc("[[#,#,*,.,*,.],[#,#,#,*,.,.],[#,#,#,.,#,.]]")), vvc("[[.,#,#],[.,#,#],[#,#,*],[#,*,.],[#,.,*],[#,.,.]]") ) } }