ในปัญหานี้ เราได้รับเมทริกซ์สี่เหลี่ยมจัตุรัสขนาด nXn งานของเราคือค้นหาองค์ประกอบที่เล็กที่สุดและใหญ่ที่สุดจากเส้นทแยงมุมของเมทริกซ์สี่เหลี่ยมจัตุรัส เราต้องหาองค์ประกอบที่เล็กที่สุดและใหญ่ที่สุดของเส้นทแยงมุมปฐมภูมิและทุติยภูมิของเมทร็อกซ์
มาดูตัวอย่างเพื่อทำความเข้าใจปัญหากัน
อินพุต
mat[][] = { {3, 4, 7}, {5, 2, 1}, {1, 8, 6} }
ผลลัพธ์
Smallest element in Primary Diagonal = 2 Largest element in Primary Diagonal = 6 Smallest element in Secondary Diagonal = 1 Largest element in Secondary Diagonal = 7
แนวทางการแก้ปัญหา
วิธีแก้ปัญหาอย่างง่ายคือการใช้การวนซ้ำซ้อน สำหรับการตรวจสอบองค์ประกอบที่เส้นทแยงมุมหลัก เราจะพิจารณา i =j . และสำหรับเส้นทแยงมุมรอง เราจะพิจารณา i + j =n -1 . เราจะหาองค์ประกอบสูงสุดและต่ำสุดของเมทริกซ์สำหรับเส้นทแยงมุมหลักและรอง
โปรแกรมเพื่อแสดงการทำงานของโซลูชันของเรา
ตัวอย่าง
#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); }
ผลลัพธ์
Smallest Element of Principal Diagonal : 2 Greatest Element of Principal Diagonal : 8 Smallest Element of Secondary Diagonal : 2 Greatest Element of Secondary Diagonal : 7
วิธีแก้ปัญหาที่มีประสิทธิภาพมากขึ้นอีกวิธีหนึ่งคือการลดลูปที่ซ้อนกันเป็นลูปเดียวโดยใช้ข้อเท็จจริงที่ว่าสำหรับเส้นทแยงมุมหลัก ดัชนีทั้งสองของแผ่นรองจะเหมือนกัน นั่นคือ
primary diagonal elements = mat[i][j]. Similarly, for secondary diagonal elements = mat[i][n - i - 1]
โปรแกรมเพื่อแสดงการทำงานของโซลูชันของเรา
ตัวอย่าง
#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); }
ผลลัพธ์
Smallest Element of Principal Diagonal : 2 Greatest Element of Principal Diagonal : 8 Smallest Element of Secondary Diagonal : 1 Greatest Element of Secondary Diagonal : 7