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

C++에서 폭탄을 설치하기 위해 죽을 최대 수의 적을 찾는 프로그램?

<시간/>

2s, 1s 및 0s의 세 가지 다른 값으로 구성된 2D 행렬이 있다고 가정합니다. 여기서 2는 적을, 1은 벽을, 0은 빈 셀을 나타냅니다. 우리는 하나의 폭탄으로 죽일 수 있는 최대의 적을 찾아야 합니다. 폭탄은 벽에 부딪힐 때까지 심은 지점에서 같은 행과 열에 있는 모든 적을 죽입니다. 그리고 우리는 공백에만 폭탄을 놓을 수 있습니다.

따라서 입력이 다음과 같으면

C++에서 폭탄을 설치하기 위해 죽을 최대 수의 적을 찾는 프로그램?

녹색 상자에 폭탄을 놓아 최대 3명의 적을 죽일 수 있으므로 출력은 3이 됩니다.

  • 렛 :=0

  • n :=그리드의 행 개수, m :=그리드의 열 개수

  • m

    크기의 배열 colCnt 정의
  • initialize i :=0의 경우 i

    • j 초기화의 경우:=0, j

      • j가 0이거나 grid[i, j]가 1과 같으면:

        • rowCnt :=0

        • grid[i, j]가 1과 같으면:

          • k :=j + 1

        • 그렇지 않으면

          • k :=j

        • k

          • rowCnt :=rowCnt + 1일 때 (grid[i, k]가 2일 때), 그렇지 않으면 0

      • i가 0이거나 grid[i, j]가 1과 같으면:

        • colCnt[j] :=0

        • grid[i, j]가 1과 같으면:

          • k :=나는 + 1

        • 그렇지 않으면

          • k :=나는

        • k

          • colCnt[j] :=colCnt[j] + 1 일 때 (그리드[k, j]가 2) 그렇지 않으면 0

      • grid[i, j]가 0과 같으면:

        • ret :=ret 및 rowCnt + colCnt[j]

          의 최대값
  • 리턴 렛

더 나은 이해를 위해 다음 구현을 살펴보겠습니다.

예시

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

class Solution {
public:
   int solve(vector<vector<int>>& grid) {
      int ret = 0;
      int n = grid.size();
      int m = n ? grid[0].size() : 0;
      int rowCnt = 0;
      vector<int> colCnt(m);
      for (int i = 0; i < n; i++) {
         for (int j = 0; j < m; j++) {
            if (!j || grid[i][j] == 1) {
               rowCnt = 0;
               int k;
               if (grid[i][j] == 1)
                  k = j + 1;
               else
                  k = j;
               for (; k < m && grid[i][k] != 1; k++) {
                  rowCnt += (grid[i][k] == 2);
               }
            }
            if (!i || grid[i][j] == 1) {
               colCnt[j] = 0;
               int k;
               if (grid[i][j] == 1)
                  k = i + 1;
               else
                  k = i;
               for (; k < n && grid[k][j] != 1; k++) {
                  colCnt[j] += (grid[k][j] == 2);
               }
            }
            if (grid[i][j] == 0) {
               ret = max(ret, rowCnt + colCnt[j]);
            }
         }
      }
      return ret;
   }
};

main(){
   Solution ob;
   vector<vector<int>> v = {
      {0,2,0,0},
      {2,0,1,2},
      {0,2,0,0}};
   cout << (ob.solve(v));
}

입력

{{0,2,0,0},
{2,0,1,2},
{0,2,0,0}}

출력

3