Computer >> 컴퓨터 >  >> 프로그램 작성 >> C++

C++ 그리드에서 조명된 셀의 수를 찾는 프로그램

<시간/>

h * w 차원의 그리드가 주어졌다고 가정합니다. 그리드의 셀에는 전구 또는 장애물이 포함될 수 있습니다. 전구 셀은 자체 조명과 오른쪽, 왼쪽, 위, 아래에 있는 셀을 조명하며 장애물 셀이 빛을 차단하지 않는 한 빛이 셀을 통해 비출 수 있습니다. 장애물 셀은 조명을 받을 수 없으며 전구 셀에서 다른 셀에 도달하는 빛을 차단합니다. 따라서 'bulb' 배열의 그리드에서 전구 셀의 위치와 'obstacles' 배열의 장애물 셀 위치가 주어지면 조명을 받는 그리드의 총 셀 수를 찾아야 합니다.

따라서 입력이 h =4, w =4, 전구 ={{1, 1}, {2, 2}, {3, 3}}, 장애물 ={{0, 0}, {2, 3과 같으면 }}, 출력은 13이 됩니다.

C++ 그리드에서 조명된 셀의 수를 찾는 프로그램

이미지에서 격자에서 조명된 셀을 볼 수 있습니다.

이 문제를 해결하기 위해 다음 단계를 따릅니다. −

bulbSize := size of bulb
blockSize := size of obstacle
Define one 2D array grid
for initialize i := 0, when i < bulbSize, update (increase i by 1), do:
   x := first value of bulb[i]
   y := second value of bulb[i]
   grid[x, y] := 1
for initialize i := 0, when i < blockSize, update (increase i by 1), do:
   x := first value of obstacle[i]
   y := first value of obstacle[i]
   grid[x, y] := 2
result := h * w
Define one 2D array check
for initialize i := 0, when i < h, update (increase i by 1), do:
   gd := 0
   for initialize j := 0, when j < w, update (increase j by 1), do:
      if grid[i, j] is same as 2, then:
         gd := 0
      if grid[i, j] is same as 1, then:
         gd := 1
      check[i, j] := check[i, j] OR gd
   gd := 0
   for initialize j := w - 1, when j >= 0, update (decrease j by 1), do:
      if grid[i, j] is same as 2, then:
         gd := 0
      if grid[i, j] is same as 1, then:
         gd := 1
      check[i, j] := check[i, j] OR gd
for initialize j := 0, when j < w, update (increase j by 1), do:
   k := 0
   for initialize i := 0, when i < h, update (increase i by 1), do:
      if grid[i, j] is same as 2, then:
         k := 0
      if grid[i, j] is same as 1, then:
         k := 1
      check[i, j] := check[i, j] OR k
   k := 0
   for initialize i := h - 1, when i >= 0, update (decrease i by 1), do:
      if grid[i, j] is same as 2, then:
         k := 0
      if grid[i, j] is same as 1, then:
         k := 1
     check[i, j] := check[i, j] OR k
for initialize i := 0, when i < h, update (increase i by 1), do:
   for initialize j := 0, when j < w, update (increase j by 1), do:
      result := result - NOT(check[i, j])
return result

예시

이해를 돕기 위해 다음 구현을 살펴보겠습니다. −

#include <bits/stdc++.h>
using namespace std;

int solve(int h, int w, vector<pair<int, int>> bulb, vector<pair<int, int>> obstacle){
   int bulbSize = bulb.size();
   int blockSize = obstacle.size();
   vector<vector<int>> grid(h, vector<int>(w, 0));
   for (int i = 0; i < bulbSize; i++) {
      int x = bulb[i].first;
      int y = bulb[i].second;
      grid[x][y] = 1;
   }
   for (int i = 0; i < blockSize; i++) {
      int x = obstacle[i].first;
      int y = obstacle[i].second;
      grid[x][y] = 2;
   }
   int result = h * w;
   vector<vector<bool>> check(h, vector<bool>(w, 0));
   for (int i = 0; i < h; i++) {
      bool gd = 0;
      for (int j = 0; j < w; j++) {
         if (grid[i][j] == 2)
            gd = 0;
         if (grid[i][j] == 1)
            gd = 1;
         check[i][j] = check[i][j] | gd;
      }
      gd = 0;
      for (int j = w - 1; j >= 0; j--) {
         if (grid[i][j] == 2)
            gd = 0;
         if (grid[i][j] == 1)
            gd = 1;
         check[i][j] = check[i][j] | gd;
      }
   }
   for (int j = 0; j < w; j++) {
      bool k = 0;
      for (int i = 0; i < h; i++) {
         if (grid[i][j] == 2)
            k = 0;
         if (grid[i][j] == 1)
            k = 1;
         check[i][j] = check[i][j] | k;
      }
      k = 0;
      for (int i = h - 1; i >= 0; i--) {
         if (grid[i][j] == 2)
            k = 0;
         if (grid[i][j] == 1) k = 1;
         check[i][j] = check[i][j] | k;
      }
   }
   for (int i = 0; i < h; i++)
      for (int j = 0; j < w; j++)
         result -= !check[i][j];
   return result;
}
int main() {
   int h = 4, w = 4;
   vector<pair<int, int>> bulb = {{1, 1}, {2, 2}, {3, 3}}, obstacle = {{0, 0}, {2, 3}};
   cout<< solve(h, w, bulb, obstacle);
   return 0;
}

입력

4, 4, {{1, 1}, {2, 2}, {3, 3}}, {{0, 0}, {2, 3}}

출력

13