在C ++中被击中时砖头掉下来

假设我们有一个二进制值(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, ]