F_JustWei's Studio.

5744. 旋转盒子

字数统计: 545阅读时长: 2 min
2021/05/16 Share

5744. 旋转盒子

给你一个 m x n 的字符矩阵 box ,它表示一个箱子的侧视图。箱子的每一个格子可能为:

  • '#' 表示石头
  • '*' 表示固定的障碍物
  • '.' 表示空位置

这个箱子被 顺时针旋转 90 度 ,由于重力原因,部分石头的位置会发生改变。每个石头会垂直掉落,直到它遇到障碍物,另一个石头或者箱子的底部。重力 不会 影响障碍物的位置,同时箱子旋转不会产生惯性 ,也就是说石头的水平位置不会发生改变。

题目保证初始时 box 中的石头要么在一个障碍物上,要么在另一个石头上,要么在箱子的底部。

请你返回一个 n x m的矩阵,表示按照上述旋转后,箱子内的结果。

示例 1:

img

1
2
3
4
输入:box = [["#",".","#"]]
输出:[["."],
["#"],
["#"]]

示例 2:

img

1
2
3
4
5
6
输入:box = [["#",".","*","."],
["#","#","*","."]]
输出:[["#","."],
["#","#"],
["*","*"],
[".","."]]

示例 3:

img

1
2
3
4
5
6
7
8
9
输入:box = [["#","#","*",".","*","."],
["#","#","#","*",".","."],
["#","#","#",".","#","."]]
输出:[[".","#","#"],
[".","#","#"],
["#","#","*"],
["#","*","."],
["#",".","*"],
["#",".","."]]

提示:

  • m == box.length
  • n == box[i].length
  • 1 <= m, n <= 500
  • box[i][j] 只可能是 '#''*' 或者 '.'

思路:

先旋转再模拟。

C++程序:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
class Solution {
public:
vector<vector<char>> rotateTheBox(vector<vector<char>>& box) {
int m = box.size();
int n = box[0].size();
vector<vector<char>> ans(n, vector<char>(m));
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
ans[j][m - i - 1] = box[i][j];
}
}

for (int j = 0; j < m; j++) {
int pos = n;
for (int i = n - 1; i >= 0; i--) {
if (ans[i][j] == '*') {
pos = i;
}
else if (ans[i][j] == '#') {
ans[i][j] = '.';
ans[--pos][j] = '#';
}
}
}

return ans;
}
};
CATALOG
  1. 1. 5744. 旋转盒子
    1. 1.0.1. 示例 1:
    2. 1.0.2. 示例 2:
    3. 1.0.3. 示例 3:
    4. 1.0.4. 提示:
    5. 1.0.5. 思路:
    6. 1.0.6. C++程序: