Python Straightforward solution with detailed explanation: rotate and fall down as far as possible
\n    def rotateTheBox(self, box: List[List[str]]) -> List[List[str]]:\n        def cellsMoveDown(board):\n            # this helper function move each stone \'
```\n    def rotateTheBox(self, box: List[List[str]]) -> List[List[str]]:\n        def cellsMoveDown(board):\n            # this helper function move each stone \'#\' down as far as possible\n            # until hitting an obstacle, another grounded box, or the bottom of the board\n            height, width = len(board), len(board[0])\n            for i in range(height - 1, -1, -1): # from lower level to higher level\n                for j in range(width):\n                    if board[i][j] == \'#\': # if it\'s a stone\n                        down_steps = 0\n                        for r in range(i + 1, height):\n                            if board[r][j] in [\'#\', \'*\']:\n                            # meet a stone or obstacle, cannot move down further, break this for loop\n                                break\n                            else: # board[r][j] is empty\n                                down_steps = r - i\n                        # move the stone down to down_steps\n                        if down_steps > 0:\n                            board[i+down_steps][j] = \'#\'\n                            board[i][j] = \'.\'\n        \n        m, n = len(box), len(box[0])\n        # create a n-by-m new box\n        new_box = [[\' \' for _ in range(m)] for _ in range(n)]\n        # rotate box to get new_box\n        for x in range(m):\n            for y in range(n):\n                new_box[y][m-1-x] = box[x][y]\n        # move all stones down as far as possible\n        cellsMoveDown(new_box)\n        return new_box\n```
[]