目标
给你一个 m x n 的字符矩阵 boxGrid ,它表示一个箱子的侧视图。箱子的每一个格子可能为:
- '#' 表示石头
- '*' 表示固定的障碍物
- '.' 表示空位置
这个箱子被 顺时针旋转 90 度 ,由于重力原因,部分石头的位置会发生改变。每个石头会垂直掉落,直到它遇到障碍物,另一个石头或者箱子的底部。重力 不会 影响障碍物的位置,同时箱子旋转不会产生惯性 ,也就是说石头的水平位置不会发生改变。
题目保证初始时 boxGrid 中的石头要么在一个障碍物上,要么在另一个石头上,要么在箱子的底部。
请你返回一个 n x m 的矩阵,表示按照上述旋转后,箱子内的结果。
示例 1:

输入:box = [["#",".","#"]]
输出:[["."],
["#"],
["#"]]
示例 2:

输入:box = [["#",".","*","."],
["#","#","*","."]]
输出:[["#","."],
["#","#"],
["*","*"],
[".","."]]
示例 3:

输入:box = [["#","#","*",".","*","."],
["#","#","#","*",".","."],
["#","#","#",".","#","."]]
输出:[[".","#","#"],
[".","#","#"],
["#","#","*"],
["#","*","."],
["#",".","*"],
["#",".","."]]
说明:
- m == boxGrid.length
- n == boxGrid[i].length
- 1 <= m, n <= 500
- boxGrid[i][j] 只可能是 '#' ,'*' 或者 '.' 。
思路
有一个 m x n 矩阵,. 表示空位,# 表示石头,* 表示障碍物。将矩阵顺时针旋转 90°,石头遇到障碍物或者底部会停止下落,返回最终的结果。
根据题意模拟,旋转矩阵,然后分别处理每一列,将石头加入栈中,并将当前格子置空,如果遇到障碍物或者底部则向上填充石头。
代码
/**
* @date 2026-05-06 9:42
*/
public class RotateTheBox1861 {
public char[][] rotateTheBox(char[][] boxGrid) {
boxGrid = rotate(boxGrid);
int m = boxGrid.length;
int n = boxGrid[0].length;
for (int j = 0; j < n; j++) {
Deque<Character> q = new ArrayDeque<>();
for (int i = 0; i < m; i++) {
char c = boxGrid[i][j];
if (c == '#') {
q.push(c);
boxGrid[i][j] = '.';
} else if (c == '*') {
int k = i - 1;
while (!q.isEmpty()){
boxGrid[k--][j] = q.pop();
}
}
}
int i = m - 1;
while (!q.isEmpty()){
boxGrid[i--][j] = q.pop();
}
}
return boxGrid;
}
public char[][] rotate(char[][] grid) {
int m = grid.length;
int n = grid[0].length;
char[][] rotated = new char[n][m];
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
rotated[j][m - 1 - i] = grid[i][j];
}
}
return rotated;
}
}
性能
