এই সমস্যাতে, আমাদের nXn আকারের একটি বর্গ ম্যাট্রিক্স দেওয়া আছে। আমাদের কাজ হলো বর্গ ম্যাট্রিক্সের প্রাইমারি (primary) এবং সেকেন্ডারি (secondary) ডায়াগোনাল থেকে সর্বনিম্ন ও সর্বোচ্চ উপাদান বের করা।
উদাহরণ দিয়ে সমস্যা বোঝা যাক,
ইনপুট
mat[][] = {
{3, 4, 7},
{5, 2, 1},
{1, 8, 6}
}
আউটপুট
Primary Diagonal: Smallest = 2, Largest = 6 Secondary Diagonal: Smallest = 1, Largest = 7
সমাধানের পদ্ধতি
এই সমস্যা সমাধানের একটি সহজ পদ্ধতি হলো নেস্টেড লুপ (nested loops) ব্যবহার করা। প্রাইমারি ডায়াগোনালের উপাদানগুলো চেক করার জন্য আমরা 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
একটি আরও কার্যকর সমাধান হলো নেস্টেড লুপকে সিঙ্গেল লুপে রূপান্তর করা, কারণ প্রাইমারি ডায়াগোনালের দুটি ইন্ডেক্স একই (mat[i][i]) এবং সেকেন্ডারি ডায়াগোনালের 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