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

C++의 행렬에서 동일한 직사각형 합을 가진 셀 인쇄

<시간/>

이 문제에서는 행렬 mat이 주어집니다. 크기 mXn의 정수 값. 우리의 임무는 행렬에서 동일한 직사각형 합으로 셀을 인쇄하는 프로그램을 만드는 것입니다. .

문제 설명: 셀로 시작하고 끝나는 부분 행렬의 합이 나머지 모든 요소의 합과 같은 방식으로 행렬에서 셀을 찾을 것입니다.

셀의 경우 행렬 (a, b) 부분행렬 mat[0][0]에서 mat[a][b]로, mat[a][b]에서 mat[m][n]으로의 합은 다음과 같습니다. 나머지 모든 요소의 합계입니다.

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

입력: 매트[][] ={ {5, 0, 2, 7}
{3, 0, 1, 0}
{1, 4, 1, 3}
{10, 0, 2, 1}}

출력: (2, 1)

설명:

요소(2,3)의 경우

부분행렬1은 - { {5, 0}
{3, 0}
{1, 4}}

부분행렬2는 - { {4, 1, 3}
{0, 2, 1}}

합계 =5 + 0 + 3 + 0 + 1 + 4 + 1 + 3 + 0 + 2 + 1 =20

나머지 요소의 합계 =2 + 7 + 1 + 0 + 10 =20

솔루션 접근 방식

문제를 해결하려면 aux1[m][n] 및 aux2[m][n]의 2개의 보조 부분행렬을 생성해야 합니다. aux1[i][j]는 (0,0)에서 (i, j)까지의 모든 요소의 합을 저장하고 aux2[i][j]는 (i,j)에서 ( n, m). 그런 다음 두 번 발생하므로 합계를 더하고 mat(i,j)를 뺍니다.

그런 다음 이 합을 행렬의 모든 요소의 합과 비교할 것입니다. 셀의 합이 행렬 합의 절반인 경우. 그런 다음 셀이 결과이고 인쇄합니다.

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

예시

#include <iostream>
using namespace std;
#define R 4
#define C 4

void findCellWithSameRectSum(int mat[R][C]) {
   
   int m = R, n = C;
   int aux1[m][n], aux2[m][n];
   int matSum = 0;
   
   for (int i = 0; i < m; i++) {
      for (int j = 0; j < n; j++) {
         
         aux2[i][j] = aux1[i][j] = mat[i][j];
         matSum += mat[i][j];
         
      }
   }

   for (int i = 1; i < m; i++) {
     
      aux1[i][0] += aux1[i-1][0];
      aux2[m-i-1][n-1] += aux2[m-i][n-1];
   }

   for (int j = 1; j < n; j++) {
     
      aux1[0][j] += aux1[0][j-1];
      aux2[m-1][n-j-1] += aux2[m-1][n-j];
   }

   for (int i = 1; i < m; i++)
      for (int j = 1; j < n; j++) {
         
         aux1[i][j] += aux1[i-1][j] + aux1[i][j-1] - aux1[i-1][j-1];
         aux2[m-i-1][n-j-1] += aux2[m-i][n-j-1] + aux2[m-i-1][n-j] - aux2[m-i][n-j];
      }

   for (int i = 0; i < m; i++)
      for (int j = 0; j < n; j++)
         if (matSum == 2 * (aux1[i][j] + aux2[i][j] - mat[i][j]))
            cout << "(" << i << ", " << j << ")\t";
}

int main() {
   int mat[R][C] = {{5, 0, 2, 7},
                {3, 0, 1, 0},
                {1, 4, 1, 3},
                {10, 0, 2, 1}};
   cout<<"The cells with same rectangular sums in a matrix is \n";
   findCellWithSameRectSum(mat);

   return 0;
}

출력

The cells with same rectangular sums in a matrix is
(1, 1)           (2, 1)