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

দুই ম্যাট্রিক্স সমান করার জন্য প্রয়োজনীয় ট্রান্সফরমেশনের সংখ্যা খুঁজে বের করা C++-এ

এই সমস্যায়, আমাদের একই আকারের দুটি ম্যাট্রিক্স mat1[][] এবং mat2[][] দেওয়া আছে। আমাদের কাজ হল দুটি ম্যাট্রিক্স সমান করার জন্য কতগুলো ট্রান্সফরমেশন দরকার তা খুঁজে বের করা।

ম্যাট্রিক্সের ট্রান্সফরমেশন হল:

  • দুটি ম্যাট্রিক্স থেকে যেকোনো একটি নির্বাচন করুন।
  • ম্যাট্রিক্স থেকে একটি সারি বা কলাম নির্বাচন করুন।
  • নির্বাচিত সারি বা কলামের সব এলিমেন্টে ১ যোগ করুন।

উদাহরণ

ইনপুট

mat1[][] = {{1, 2}, {2, 1}}
mat2[][] = {{2, 3}, {4, 3}}

আউটপুট

3

ব্যাখ্যা

১ ২  =>  ২ ২  =>  ২ ৩  =>  ২ ৩
২ ১  =>  ৩ ১  =>  ৩ ২  =>  ৪ ৩

সমাধানের পদ্ধতি

এই সমস্যার সহজ সমাধান হল ট্রান্সফরমেশন সম্ভব কিনা তা বের করা। এর জন্য আমাদের চেক করতে হবে:

if( mat[i][j] - mat[i][0] - mat[0][j] + mat[0][0] != 0 )

তবে কোনো সমাধান নেই।

যদি ট্রান্সফরমেশন সম্ভব হয়, তবে আমরা সারি ও কলামের জন্য ট্রান্সফরমেশন গণনা করব।

প্রোগ্রাম উদাহরণ

#include <bits/stdc++.h>
using namespace std;

const int MAX = 100;

int countTransformationReq(int mat1[][MAX], int mat2[][MAX], int m, int n) {
    for (int i = 0; i < n; i++)
        for (int j = 0; j < m; j++)
            mat1[i][j] -= mat2[i][j];
    
    for (int i = 1; i < n; i++)
        for (int j = 1; j < m; j++)
            if (mat1[i][j] - mat1[i][0] - mat1[0][j] + mat1[0][0] != 0)
                return -1;
    
    int trxCount = 0;
    for (int i = 0; i < n; i++)
        trxCount += abs(mat1[i][0]);
    for (int j = 0; j < m; j++)
        trxCount += abs(mat1[0][j] - mat1[0][0]);
    
    return trxCount;
}

int main() {
    int mat1[MAX][MAX] = { {1, 2}, {2, 1} };
    int mat2[MAX][MAX] = { {2, 3}, {4, 3} };
    cout << "The number of transformation to make the two matrices equal are " << countTransformationReq(mat1, mat2, 2, 2);
    return 0;
}

আউটপুট

The number of transformation to make the two matrices equal are 3

দক্ষ পদ্ধতি

এই সমস্যার আরও একটি দক্ষ সমাধান হল হ্যান্ডশেক সূত্র ব্যবহার করা। আমরা একটি টেম্প অ্যারে তৈরি করব ০ এবং ১-এর অকুরেন্স গণনা করার জন্য মডুলো অ্যারেতে। এবং তারপর কাউন্ট ভ্যালু রিটার্ন করব।

প্রোগ্রাম উদাহরণ (অন্য সমস্যা: সম যোগফল ওয়ালা সাবঅ্যারে)

#include <iostream>
using namespace std;

int countEvenSumSubArray(int arr[], int n){
    int temp[2] = {1, 0};
    int count = 0, sum = 0;
    for (int i = 0; i <= n-1; i++){
        sum = ((sum + arr[i]) % 2 + 2) % 2;
        temp[sum]++;
    }
    count += (temp[0] * (temp[0] - 1) / 2);
    count += (temp[1] * (temp[1] - 1) / 2);
    return count;
}

int main(){
    int arr[] = {2, 1, 4, 2};
    int n = sizeof(arr) / sizeof(arr[0]);
    cout << "The count of Subarrays with even sum is " << countEvenSumSubArray(arr, n);
    return 0;
}

আউটপুট

The count of Subarrays with even sum is 4
  1. সি++ প্রোগ্রাম: অ্যারে কি দুটি সমান যোগফল والی সাবঅ্যারে (subarray) এ ভাগ করা সম্ভব কিনা যাচাই

  2. C++ ব্যবহার করে দুটি স্ট্রিং সমান করার ন্যূনতম অপারেশন সংখ্যা

  3. C++-এ 유리 সংখ্যার LCM খুঁজে বের করা

  4. C++ প্রোগ্রাম: ম্যাট্রিক্সে দুটি সেলের মধ্যকে পথ আছে কিনা চেক করা