假设我们有一个二进制值(0和1)的网格,单元格中的1代表砖。满足以下条件的砖不会掉落-
任一砖都直接连接到网格顶部
或至少相邻的一块砖(顶部,底部,左侧,右侧)不会掉落。
我们将按顺序进行一些擦除。在每种情况下,我们都希望在位置(i,j)处进行擦除,该位置上的砖块(如果存在)将消失,然后由于该擦除操作,其他一些砖块可能会掉落。我们必须找到一个数组,该数组表示每次擦除后将下降的砖块数量。
因此,如果输入像grid = [[1,0,0,0],[1,1,1,0]]并命中= [[1,0]],那么输出将是[2],这是因为如果我们移除放置在(1,0)处的砖,则(1,1)和(1,2)处的砖将掉落。所以我们应该返回2。
为了解决这个问题,我们将遵循以下步骤-
定义大小为4 x 2的数组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, ]