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

C++ 보드의 전함

<시간/>

2D 보드가 있다고 가정하고 그 안에 있는 전함의 수를 계산해야 합니다. 전함은 'X' 기호로 표시되고 빈 슬롯은 '.'로 표시됩니다. 우리는 다음 규칙을 가정할 수 있습니다 -

  • 전함이나 빈 슬롯으로만 구성된 유효한 보드를 받습니다.

  • 전함은 가로 또는 세로로만 배치할 수 있습니다. 즉, 1xN(1행, N열) 또는 Nx1(N행, 1열) 모양으로만 만들 수 있으며, 여기서 N은 임의의 크기일 수 있습니다.

  • 최소 하나의 수평 또는 수직 셀이 두 전함 사이를 분리합니다. 인접한 전함이 없습니다.

따라서 보드가 다음과 같은 경우:

X . . X
. . . X
. . . X

그러면 두 척의 전함이 있으므로 출력은 2가 됩니다.

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

  • ans :=0, n :=행 개수 및 m :=열 개수

  • i번째 행에 대해

    • j번째 열에 대해

      • board[i, j]가 점이면 다음 반복으로 이동합니다.

      • i> 0이고 board[i – 1, j] ='X'이면 다음 반복으로 이동합니다.

      • j> 0이고 board[i, j - 1] ='X'이면 다음 반복으로 이동합니다.

      • 1만큼 증가

  • 반환

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

예시

#include <bits/stdc++.h>
using namespace std;
class Solution {
   public:
   int countBattleships(vector<vector<char>>& board) {
      int ans = 0;
      int n = board.size();
      int m = board[0].size();
      for(int i = 0; i < n; i++){
         for(int j = 0; j < m; j++){
            if(board[i][j] == '.')continue;
            if(i > 0 && board[i - 1][j] == 'X')continue;
            if(j > 0 && board[i][j - 1] == 'X')continue;
            ans++;
         }
      }
      return ans;
   }
};
main(){
   vector<vector<char>> v = {{'X','.','.','X'},{'.','.','.','X'},{'.','.','.','X'}};
   Solution ob;
   cout << (ob.countBattleships(v));
}

입력

[["X",".",".","X"],[".",".",".","X"],[".",".",".","X"]]

출력

2