在C ++中被击中时砖头掉下来
任一砖都直接连接到网格顶部
或至少相邻的一块砖(顶部,底部,左侧,右侧)不会掉落。
我们将按顺序进行一些擦除。在每种情况下,我们都希望在位置(i,j)处进行擦除,该位置上的砖块(如果存在)将消失,然后由于该擦除操作,其他一些砖块可能会掉落。我们必须找到一个数组,该数组表示每次擦除后将下降的砖块数量。
因此,如果输入像grid=[[1,0,0,0],[1,1,1,0]]并命中=[[1,0]],那么输出将是[2],这是因为如果我们移除放置在(1,0)处的砖,则(1,1)和(1,2)处的砖将掉落。所以我们应该返回2。
为了解决这个问题,我们将遵循以下步骤-
定义大小为4x2的数组dir,dir:={{{1,0},{-1,0},{0,1},{0,-1}}
定义一个函数dfs(),它将使用i,j,网格,
如果(i,j)在网格区域内并且grid[i,j]不等于1,则-
返回0
ret:=1
格[i,j]:=2
对于初始化k:=0,当k<4时,更新(将k增加1),执行-
ret:=ret+dfs(i+dir[k,0],j+dir[k,1],网格)
返回ret
定义一个函数notConnected(),它将采用x,y和网格,
对于初始化k:=0,当k<4时,更新(将k增加1),执行-
返回真
忽略以下部分,跳至下一个迭代
nx:=x+dir[k,0],ny:=y+dir[k,1]
如果(nx,ny)在网格范围内,则-
如果grid[nx,ny]与2相同,则-
当x等于0时返回true
从主要方法中,执行以下操作-
定义数组ret
对于初始化i:=0,当i<命中大小时,更新(将i增加1),执行-
grid[hits[i,0],hits[i,1]]:=grid[hits[i,0],hits[i,1]]-1
对于初始化i:=0,当i<网格大小时,更新(将i增加1),执行-
dfs(0,i,格)
反转阵列命中
对于初始化i:=0,当i<命中大小时,更新(将i增加1),执行-
在ret的末尾插入0
在ret的末尾插入dfs(x,y,grid)
x:=hits[i,0],y:=hits[i,1]
如果grid[x,y]等于1且notConnected(x,y,grid),则-
除此以外
反转数组ret
返回ret
让我们看下面的实现以更好地理解-
示例
#include <bits/stdc++.h>
using namespace std;
void print_vector(vector<auto> v){
cout << "[";
for(int i = 0; i<v.size(); i++){
cout << v[i] << ", ";
}
cout << "]"<<endl;
}
int dir[4][2] = {{1, 0}, {-1, 0}, {0, 1}, {0, -1}};
class Solution {
public:
int dfs(int i, int j, vector<vector<int> >& grid){
if (i < 0 || j < 0 || i >= grid.size() || j >= grid[0].size() || grid[i][j] != 1) {
return 0;
}
int ret = 1;
grid[i][j] = 2;
for (int k = 0; k < 4; k++) {
ret += dfs(i + dir[k][0], j + dir[k][1], grid);
}
return ret;
}
bool notConnected(int x, int y, vector<vector<int> >& grid){
for (int k = 0; k < 4; k++) {
int nx = x + dir[k][0];
int ny = y + dir[k][1];
if (nx < 0 || ny < 0 || nx >= grid.size() || ny >= grid[0].size())
continue;
if (grid[nx][ny] == 2) {
return true;
}
}
return x == 0;
}
vector<int> hitBricks(vector<vector<int> >& grid, vector<vector<int> >& hits){
vector<int> ret;
for (int i = 0; i < hits.size(); i++) {
grid[hits[i][0]][hits[i][1]] -= 1;
}
for (int i = 0; i < grid.size(); i++) {
dfs(0, i, grid);
}
reverse(hits.begin(), hits.end());
for (int i = 0; i < hits.size(); i++) {
int x = hits[i][0];
int y = hits[i][1];
grid[x][y] += 1;
if (grid[x][y] == 1 && notConnected(x, y, grid))
ret.push_back(dfs(x, y, grid) - 1);
else
ret.push_back(0);
}
reverse(ret.begin(), ret.end());
return ret;
}
};
main(){
Solution ob;
vector<vector<int>> v = {{1,0,0,0},{1,1,1,0}};
vector<vector<int>> v1 ={{1,0}};
print_vector(ob.hitBricks(v, v1));
}输入项
{{1,0,0,0},{1,1,1,0}}, {{1,0}}输出结果
[2, ]