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

C++의 행렬에서 정사각형의 최대 변 길이 찾기


이 문제에서 크기가 n인 2차원 행렬 mat[][]가 주어지며, n은 홀수입니다. 우리의 임무는 행렬에서 정사각형의 최대 변 길이를 찾는 것입니다.

문제 설명 − 둘레 값이 동일하고 행렬과 같은 중심을 공유하는 정사각형 행렬의 길이를 찾아야 합니다.

문제를 이해하기 위해 예를 들어 보겠습니다.

입력

mat[][] = {
   {2, 4, 6, 6, 5},
   {1, 7, 7, 7, 3},
   {5, 7, 0, 7, 1},
   {3, 7, 7, 7, 1},
   {2, 0, 1, 3, 2}
}

출력

3

솔루션 접근 방식

문제에 대한 간단한 솔루션은 행렬의 중심 요소를 찾는 것입니다. 홀수 행렬이므로 중심 요소는 인덱스(n/2, n/2)에 있습니다. 중심을 찾은 후 모든 2D 하위 요소를 찾을 수 있습니다. 모든 요소가 동일한지 확인하는 주변 행렬입니다.

중심에서 떨어진 인덱스 i의 부분행렬은 인덱스 (n/2 - 1)에서 (n/2 + 1)까지 행(n/2 - 1) 및 (n/2 + 1)의 요소를 갖습니다. 또한 인덱스(n/2 - 1)에서 (n/2 + 1)까지의 열(n/2 - 1) 및 (n/2 + 1) 요소가 둘레에 포함됩니다. 0에서 n/2까지의 i 값에 대한 부분행렬이 모든 둘레 요소가 동일한지 확인해야 합니다.

우리 솔루션의 작동을 설명하는 프로그램

예시

#include <iostream>
#define n 5
using namespace std;
int findMaxSideSquare(int matrix[][n]) {
   int squareLen = 1;
   for (int i = 0; i < n / 2; i++) {
      int sideVal = matrix[i][i];
      bool isSquare = true;
      for (int j = i; j < n - i; j++) {
         if (matrix[i][j] != sideVal)
            isSquare = false;
         if (matrix[n - i - 1][j] != sideVal)
            isSquare = false;
         if (matrix[j][i] != sideVal)
            isSquare = false;
         if (matrix[j][n - i - 1] != sideVal)
            isSquare = false;
      }
      if (isSquare)
         squareLen = n - 2 * i;
   }
   return squareLen;
}
int main() {
   int mat[n][n] = {
      {2, 4, 6, 6, 5},
      {1, 7, 7, 7, 3},
      {5, 7, 0, 7, 1},
      {3, 7, 7, 7, 1},
      {2, 0, 1, 3, 2}
   };
   cout<<"The maximum side length of square in a Matrix is "<<findMaxSideSquare(mat);
   return 0;
}

출력

The maximum side length of square in a Matrix is 3