Trong bài toán này, cho ma trận vuông kích thước NxN. Nhiệm vụ là tìm phần tử nhỏ nhất và lớn nhất trên đường chéo chính và phụ.
Ví dụ minh họa:
Đầ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 giải
Cách đơn giản: dùng lặp lồng. Đường chéo chính: i = j. Đường chéo phụ: i + j = n - 1. Tìm min/max cho cả hai.
Chương trình minh họa (cách 1):
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);
}Kết quả
Smallest Element of Principal Diagonal : 2 Greatest Element of Principal Diagonal : 8 Smallest Element of Secondary Diagonal : 2 Greatest Element of Secondary Diagonal : 7
Cách hiệu quả hơn: giảm lặp lồng thành một vòng lặp vì đường chéo chính: mat[i][i], đường chéo phụ: mat[i][n-i-1].
Chương trình minh họa (cách 2):
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);
}Kết quả
Smallest Element of Principal Diagonal : 2 Greatest Element of Principal Diagonal : 8 Smallest Element of Secondary Diagonal : 1 Greatest Element of Secondary Diagonal : 7