Computer >> Máy Tính >  >> Lập trình >> C ++

Tìm phần tử nhỏ nhất và lớn nhất từ ​​các đường chéo của ma trận vuông trong C ++

Trong bài toán này, chúng ta được cung cấp một ma trận vuông kích thước nXn. Nhiệm vụ của chúng ta là Tìm phần tử nhỏ nhất và lớn nhất từ ​​các đường chéo của ma trận vuông. Chúng ta cần tìm các phần tử nhỏ nhất và lớn nhất của đường chéo chính và phụ của ma trận.

Hãy lấy một ví dụ để hiểu vấn đề,

Đầu vào

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

Đầu ra

Smallest element in Primary Diagonal = 2
Largest element in Primary Diagonal = 6
Smallest element in Secondary Diagonal = 1
Largest element in Secondary Diagonal = 7

Phương pháp tiếp cận giải pháp

Một giải pháp đơn giản để giải quyết vấn đề là sử dụng các vòng lặp lồng nhau. Để kiểm tra các phần tử ở đường chéo chính, chúng tôi sẽ xem xét i =j . Và đối với đường chéo phụ, chúng ta sẽ xem xét i + j =n -1 . Chúng tôi sẽ tìm các phần tử tối đa và tối thiểu của ma trận cho cả đường chéo chính và phụ.

Chương trình minh họa hoạt động của giải pháp của chúng tôi,

Ví dụ

#include<iostream>
using namespace std;
void findMaxAndMinOfDiagonals(int mat[3][3], int n){
   if (n == 0)
      return;
   int pDiagMin = mat[0][0],
   pDiagMax = mat[0][0];
   int sDiagMin = mat[0][n - 1 ],
   sDiagMax = mat[0][n - 1];
   for (int i = 1; i < n; i++) {
      for (int j = 1; j < n; j++) {
         if (i == j){
            if (mat[i][j] < pDiagMin)
               pDiagMin = mat[i][j];
            if (mat[i][j] > pDiagMax)
            pDiagMax = mat[i][j];
         }
         if ((i + j) == (n - 1)) {
            if (mat[i][j] < sDiagMin){
               sDiagMin = mat[i][j];
            }
            if (mat[i][j] > sDiagMax)
               sDiagMax = mat[i][j];
         }
      }
   }
   cout<<("\nSmallest Element of Principal Diagonal : ")<<pDiagMin;
   cout<<("\nGreatest Element of Principal Diagonal : ")<<pDiagMax;
   cout<<("\nSmallest Element of Secondary Diagonal : ")<<sDiagMin;
   cout<<("\nGreatest Element of Secondary Diagonal : ")<<sDiagMax;
}
int main(){
   int mat[3][3] = {
      { 3, 4, 7 },
      { 0, 2, 1 },
      { 1, 7, 8 }
   };
   int n = sizeof(mat) / sizeof(mat[0]);
   findMaxAndMinOfDiagonals(mat, n);
}

Đầu ra

Smallest Element of Principal Diagonal : 2
Greatest Element of Principal Diagonal : 8
Smallest Element of Secondary Diagonal : 2
Greatest Element of Secondary Diagonal : 7

Một giải pháp khác hiệu quả hơn là giảm vòng lặp lồng nhau thành vòng lặp đơn do thực tế là đối với đường chéo chính, cả hai chỉ số của thảm đều giống nhau, tức là

primary diagonal elements = mat[i][j].
Similarly, for secondary diagonal elements = mat[i][n - i - 1]

Chương trình minh họa hoạt động của giải pháp của chúng tôi,

Ví dụ

#include<iostream>
using namespace std;
void findMaxAndMinOfDiagonals(int mat[3][3], int n){
   if (n == 0)
      return;
   int pDiagMin = mat[0][0],
   pDiagMax = mat[0][0];
   int sDiagMin = mat[0][n - 1 ],
   sDiagMax = mat[0][n - 1];
   for (int i = 1; i < n; i++) {
      if (mat[i][i] < pDiagMin)
         pDiagMin = mat[i][i];
      if (mat[i][i] > pDiagMax)
         pDiagMax = mat[i][i];
      if (mat[i][n - 1 - i] < sDiagMin)
         sDiagMin = mat[i][n - 1 - i];
      if (mat[i][n - 1 - i] > sDiagMax)
         sDiagMax = mat[i][n - 1 - i];
   }
   cout<<("\nSmallest Element of Principal Diagonal : ")<<pDiagMin;
   cout<<("\nGreatest Element of Principal Diagonal : ")<<pDiagMax;
   cout<<("\nSmallest Element of Secondary Diagonal : ")<<sDiagMin;
   cout<<("\nGreatest Element of Secondary Diagonal : ")<<sDiagMax;
}
int main(){
   int mat[3][3] = {
      { 3, 4, 7 },
      { 0, 2, 1 },
      { 1, 7, 8 }
   };
   int n = sizeof(mat) / sizeof(mat[0]);
   findMaxAndMinOfDiagonals(mat, n);
}

Đầu ra

Smallest Element of Principal Diagonal : 2
Greatest Element of Principal Diagonal : 8
Smallest Element of Secondary Diagonal : 1
Greatest Element of Secondary Diagonal : 7