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

C++-এ দুটি বাইনারি অ্যারেয়ের XOR অন্য একটি অ্যারের সমান করার জন্য ন্যূনতম ফ্লিপ

সমস্যা বিবরণ

আকার n এর তিনটি অ্যারে দেওয়া আছে যেগুলো ০ এবং ১ দিয়ে গঠিত। কাজটি হল প্রথম এবং দ্বিতীয় অ্যারেতে ন্যূনতম বিট ফ্লিপ করাতে হবে যাতে প্রথম এবং দ্বিতীয় অ্যারেতে i-তম ইনডেক্স বিটর XOR তৃতীয় অ্যারেতে i-তম ইনডেক্স বিটর সমান হয়।

দয়া করে নোট করুন যে আমরা অ্যারে ১-এ সর্বোচ্চ p বিট এবং অ্যারে ২-এ সর্বোচ্চ q বিট ফ্লিপ করতে পারি। অ্যারে এলিমেন্ট গুলো রি-অ্যারেঞ্জ করা যাবে না।

মনে করুন p = 2 এবং q = 5

arr1[] = {1, 0, 1, 1, 0, 1, 0}
arr2[] = {0, 1, 0, 1, 0, 0, 1}
arr3[] = {0, 1, 1, 0, 0, 0, 0}
  • (arr1[0] ^ arr2[0]) অর্থাৎ (1 ^ 0) = 1 যা arr3[0]-এর সমান নয়। অতএব ফ্লিপ প্রয়োজন।
  • (arr1[1] ^ arr2[1]) অর্থাৎ (0 ^ 1) = 1 যা arr3[1]-এর সমান। অতএব ফ্লিপ প্রয়োজন নেই।
  • (arr1[2] ^ arr2[2]) অর্থাৎ (1 ^ 0) = 1 যা arr3[2]-এর সমান। অতএব ফ্লিপ প্রয়োজন নেই।
  • (arr1[3] ^ arr2[3]) অর্থাৎ (1 ^ 1) = 0 যা arr3[3]-এর সমান। অতএব ফ্লিপ প্রয়োজন নেই।
  • (arr1[4] ^ arr2[4]) অর্থাৎ (0 ^ 0) = 0 যা arr3[4]-এর সমান। অতএব ফ্লিপ প্রয়োজন নেই।
  • (arr1[5] ^ arr2[5]) অর্থাৎ (1 ^ 0) = 1 যা arr3[5]-এর সমান নয়। অতএব ফ্লিপ প্রয়োজন।
  • (arr1[6] ^ arr2[6]) অর্থাৎ (0 ^ 1) = 1 যা arr3[6]-এর সমান নয়। অতএব ফ্লিপ প্রয়োজন।

অ্যালগরিদম

1. যদি (arr1[i] ^ arr2[i]) == arr3[i] তবে চালিয়ে যাও কারণ ফ্লিপ প্রয়োজন নেই।
2. যদি (arr1[i] ^ arr2[i]) != arr3[i] তবে ফ্লিপ প্রয়োজন।
    a. যদি arr3[i] == 0 তবে নিচের শর্তগুলো থেকে যেকোনো একটি সত্য:
        i. (arr1[i] == 0) এবং (arr2[i] == 0) অথবা
        ii. (arr1[i] == 1) এবং (arr2[i] == 1)
    b. যদি arr3[i] == 1 তবে নিচের শর্তগুলো থেকে যেকোনো একটি সত্য:
        i. (arr1[i] == 0) এবং (arr2[0] == 1) অথবা
        ii. (arr1[i] == 1) এবং (arr2[i] == 0)
3. যদি ফ্লিপ প্রয়োজন হয় তবে আমরা arr1[i] বা arr2[i] যেকোনো একটি ফ্লিপ করতে পারি। অতএব আমরা নিষ্কর্ষ করতে পারি যে arr1 এবং arr2-এর XOR কে arr3-এর সমান করার জন্য প্রয়োজনীয় ফ্লিপ সংখ্যা p + q-এর চেয়ে কম বা সমান হতে হবে।

উদাহরণ (C++ কোড)

#include <iostream>
#define SIZE(arr) (sizeof(arr) / sizeof(arr[0]))
using namespace std;

int getRequiredFlips(int *arr1, int *arr2, int *arr3, int n, int p, int q) {
    int flips = 0;
    for (int i = 0; i < n; ++i) {
        if ((arr1[i] ^ arr2[i]) != arr3[i]) {
            ++flips;
        }
    }
    return flips <= (p + q) ? flips : -1;
}

int main() {
    int arr1[] = {1, 0, 1, 1, 0, 1, 0};
    int arr2[] = {0, 1, 0, 1, 0, 0, 1};
    int arr3[] = {0, 1, 1, 0, 0, 0, 0};
    int size = SIZE(arr1);
    cout << "Flips required: " << getRequiredFlips(arr1, arr2, arr3, size, 2, 5) << "\n";
    return 0;
}

আউটপুট

Flips required: 3
  1. সি++-এ বাইনারি ম্যাট্রিক্সকে শূন্য ম্যাট্রিক্সে রূপান্তর করার জন্য ন্যূনতম ফ্লিপ সংখ্যা

  2. C++ ব্যবহার করে দুটি অনসর্টেড অ্যারে সর্টেড অর্ডারে মার্জ করা

  3. C++ ব্যবহার করে অ্যারেতে XOR ০ হয় এমন জোড়ার সংখ্যা বের করা

  4. C++ প্রোগ্রাম: বাইনারি সার্চ দিয়ে দুটি সোর্টেড অ্যারের মেডিয়ান বের করা