কম্পিউটার টিউটোরিয়াল

বাইনারি ম্যাট্রিক্সে ১-এর গণনা ০-এর চেয়ে এক বেশি হলে সর্বোচ্চ সাব-ম্যাট্রিক্স এলিয়া (C++ প্রোগ্রাম)

এই সমস্যাতে, আমাদের n×n আকারের একটি 2-D ম্যাট্রিক্স দেওয়া আছে যেটি বাইনারি সংখ্যা (০/১) ধারণ করে। আমাদের কাজ হল ১-এর গণনা ০-এর চেয়ে এক বেশি হলে সর্বোচ্চ সাব-ম্যাট্রিক্স এলিয়া খুঁজে বের করার প্রোগ্রাম তৈরি করা।

উদাহরণ ইনপুট
bin[N][N] = { {0, 1, 0, 0}, {1, 1, 0, 0}, {1, 0, 1, 1}, {0, 1, 0, 1} }
আউটপুট
9
ব্যাখ্যা
সাবম্যাট্রিক্স: bin[1][0], bin[1][1], bin[1][2]
bin[2][0], bin[2][1], bin[2][2]
bin[3][0], bin[3][1], bin[3][2]
এটি ০-এর চেয়ে ১ বেশি ১ সহ সবচেয়ে বড় সাবঅ্যারে।
০-এর সংখ্যা = ৪
১-এর সংখ্যা = ৫
সমাধানের পদ্ধতি

একটি সহজ পদ্ধতি হল ম্যাট্রিক্স থেকে সব সম্ভাব্য সাবম্যাট্রিক্স বের করে সর্বোচ্চ এলিয়া ফেরত দেওয়া। এই পদ্ধতি ভাবা এবং বাস্তবায়ন করা সহজ হলেও এতে অনেক সময় লাগে এবং লুপ নেস্টিং এর কারণে এর টাইম কমপ্লেক্সিটি O(n⁴) হয়। তাই আসুন আরেকটি আরও কার্যকর পদ্ধতি আলোচনা করি।

এখানে আইডিয়া হল ম্যাট্রিক্সের বাম এবং ডান কলাম ফিক্স করে তারপর সবচেয়ে বড় সাবঅ্যারে খুঁজে বের করা যেটিতে ০-এর সংখ্যা ১-এর চেয়ে এক বেশি। আমরা প্রতিটি সারিতে যোগফল হিসাব করব এবং তারপর সেটি কিউমুলেট করব। ১-এর গণনা ০-এর চেয়ে এক বেশি হওয়ার সর্বোচ্চ এলিয়া বের করার জন্য।

C++ প্রোগ্রাম উদাহরণ
#include 
using namespace std;

#define SIZE 10

int lenOfLongSubarr(int row[], int n, int& startInd, int& finishInd) {
    unordered_map subArr;
    int sumVal = 0, maxSubArrLen = 0;
    for (int i = 0; i < n; i++) {
        sumVal += row[i];
        if (sumVal == 1) {
            startInd = 0;
            finishInd = i;
            maxSubArrLen = i + 1;
        } else if (subArr.find(sumVal) == subArr.end())
            subArr[sumVal] = i;
        
        if (subArr.find(sumVal - 1) != subArr.end()) {
            int currLen = (i - subArr[sumVal - 1]);
            if (maxSubArrLen < currLen) {
                startInd = subArr[sumVal - 1] + 1;
                finishInd = i;
                maxSubArrLen = currLen;
            }
        }
    }
    return maxSubArrLen;
}

int largestSubmatrix(int bin[SIZE][SIZE], int n) {
    int rows[n], maxSubMatArea = 0, currArea, longLen, startInd, finishInd;
    for (int left = 0; left < n; left++) {
        memset(rows, 0, sizeof(rows));
        for (int right = left; right < n; right++) {
            for (int i = 0; i < n; ++i) {
                if (bin[i][right] == 0)
                    rows[i] -= 1;
                else
                    rows[i] += 1;
            }
            longLen = lenOfLongSubarr(rows, n, startInd, finishInd);
            currArea = (finishInd - startInd + 1) * (right - left + 1);
            if ((longLen != 0) && (maxSubMatArea < currArea)) {
                maxSubMatArea = currArea;
            }
        }
    }
    return maxSubMatArea;
}

int main() {
    int bin[SIZE][SIZE] = {
        { 1, 0, 0, 1 },
        { 0, 1, 1, 1 },
        { 1, 0, 0, 0 },
        { 0, 1, 0, 1 }
    };
    int n = 4;
    cout << "The maximum sub-matrix area having count of 1's one more than count of 0's is " << largestSubmatrix(bin, n);
    return 0;
}
আউটপুট
The maximum sub-matrix area having count of 1's one more than count of 0's is 9
  1. সি++-এ সমান্তরাল চতুর্ভুজের (Parallelogram) ক্ষেত্রফল বের করার প্রোগ্রাম

  2. C++-এ বর্গক্ষেত্রের এলাকা বের করার প্রোগ্রাম

  3. C++-এ অক্টাহেড্রনের সারফেস এরিয়া বের করার প্রোগ্রাম

  4. C++-এ দুইটির অধিক সংখ্যার GCD (GCD of Array/Multiple Numbers)