Computer >> कंप्यूटर >  >> प्रोग्रामिंग >> C++

दो बाइनरी सरणी में न्यूनतम फ़्लिप ताकि उनका एक्सओआर सी ++ में किसी अन्य सरणी के बराबर हो।

समस्या कथन

0 और 1 के आकार n के साथ तीन सरणियों को देखते हुए, कार्य पहले और दूसरे सरणी में बिट्स के न्यूनतम फ्लिप को खोजने के लिए है जैसे कि पहले और दूसरे सरणी के i'th इंडेक्स बिट का XOR i'th इंडेक्स बिट के बराबर है तीसरी सरणी।

कृपया ध्यान दें कि हम केवल सरणी 1 के अधिकांश p बिट्स और सरणी 2 के अधिकतम 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. If (arr1[i] ^ arr2[i]) == arr3[i] then continue as flip is not required.
2. If (arr1[i] ^ arr2[i]) != arr3[i] then flip is required.
   a. If arr3[i] == 0 then one of the following condition is
   true:
      i. (arr1[i] == 0) and (arr2[i] == 0) OR
      ii. (arr1[i] == 1) and (arr2[i] == 1)
   b. If arr3[i] == 1 then one of the following condition is
   true:
      i. (arr1[i] == 0) and (arr2[0] == 1) OR
      ii. (arr1[i] == 1) and (arr2[i] == 0)
3. If flip is required then we can either flip arr1[i] or arr2[i]. Hence we can conclude that number of flips required to make XOR of arr1 and arr2 equal to arr3 should be less than or equal to p + q.

उदाहरण

#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. C++ में बाइनरी मैट्रिक्स को ज़ीरो मैट्रिक्स में बदलने के लिए फ़्लिप की न्यूनतम संख्या

    मान लीजिए हमारे पास एक m x n बाइनरी मैट्रिक्स मैट है। एक चरण में, हम एक सेल चुन सकते हैं और उसके बिट को फ्लिप कर सकते हैं और यदि वे मौजूद हैं तो उसके चारों पड़ोसी। हमें मैट को शून्य मैट्रिक्स में बदलने के लिए आवश्यक न्यूनतम चरणों की संख्या ज्ञात करनी होगी। अगर कोई समाधान नहीं है, तो -1 लौटें। इसलिए

  1. एक सरणी में जोड़े की संख्या पाएं जैसे कि उनका एक्सओआर 0 सी ++ का उपयोग कर रहा है।

    मान लीजिए हमारे पास n तत्वों की एक सरणी है; हमें सरणी में ऐसे कई जोड़े खोजने हैं जिनका XOR 0 होगा। युग्म (x, y) जिसका XOR 0 है, तो x =y है। इसे हल करने के लिए हम सरणी को सॉर्ट कर सकते हैं, फिर यदि दो लगातार तत्व समान हैं, तो गिनती बढ़ाएं। यदि सभी तत्व समान हैं, तो अंतिम गणना नहीं की जा सकती है। उस स

  1. C++ प्रोग्राम बाइनरी सर्च एप्रोच का उपयोग करके दो सॉर्ट किए गए सरणियों के माध्यिका को खोजने के लिए

    हम द्विआधारी खोज दृष्टिकोण का उपयोग करके दो क्रमबद्ध सरणियों के माध्यिका को खोजने के लिए एक C++ प्रोग्राम विकसित करेंगे। एल्गोरिदम Begin    Function median() with both the arrays and the start and end indexes of each array, which have two arrays and their respective elements as argument. &