从Leetcode 每日一题练习继续讨论:
1861. 旋转盒子
1861. Rotating the Box
题解
本题图里的石头挺有意思的,像哪里来的魔法石。题目直观的想象是将一个容器翻转90°,翻转后石头会自由落体直到落到一块比较坚实的“地面”上。考虑原来的行和翻转后的列的关系,原来的第一行翻转后会变为第一列,如果共有m行n列,那么原来位于(p,q)位置的会变为位于(q,m-p-1)。先构建一个n x m的空数组,遍历原始的m x n数组,当按行遍历时统计该行中遇到过的石头的个数直到遇到一个障碍物,此时将该障碍物按照转换后的位置填入空数组中,并根据该障碍物前面的石头个数在空数组中该障碍物的位置向上填充对应数量的石头。如此反复,即得最终转换后的数组。
代码
class Solution {
public:
vector<vector<char>> rotateTheBox(vector<vector<char>>& box) {
int m = box.size();
int n = box[0].size();
vector<vector<char>> rotate(n,(vector<char>(m,'.')));
int stones = 0;
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
if (box[i][j] == '#'){
stones++;
}else if(box[i][j] == '*'){
rotate[j][m-i-1] = '*';
while(stones > 0){
rotate[j-stones][m-i-1] = '#';
stones--;
}
}
}
while(stones > 0){
rotate[n-stones][m-i-1] = '#';
stones--;
}
}
return rotate;
}
};