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

C++ में जीनों के कुल उत्परिवर्तन समूह को खोजने का कार्यक्रम

मान लीजिए हमारे पास जीन नामक स्ट्रिंग्स की एक सूची है जहां प्रत्येक तत्व की लंबाई समान होती है और प्रत्येक तत्व में "ए", "सी", "जी" और/या "टी" वर्ण होते हैं। अब कुछ नियम हैं -

  • जब दो तार s1 और s2 एक वर्ण को छोड़कर एक ही स्ट्रिंग होते हैं, तो s1 और s2 एक ही उत्परिवर्तन समूह में होते हैं।

  • जब दो तार s1 और s2 एक समूह में होते हैं और s2 और s3 एक समूह में होते हैं, तो s1 और s3 एक ही समूह में होते हैं।

हमें उन उत्परिवर्तन समूहों की कुल संख्या ज्ञात करनी है जो हम उत्पन्न कर सकते हैं।

इसलिए, यदि इनपुट जीन की तरह है =["ACGT", "ACGC", "ACTT", "TTTT", "TGTT"], तो आउटपुट 2 होगा, क्योंकि दो उत्परिवर्तन समूह हैं:["ACGT", "ACGC", "ACTT"] और ["TTTT", "TTTG"]

इसे हल करने के लिए, हम इन चरणों का पालन करेंगे -

  • माता-पिता नामक एक मानचित्र को परिभाषित करें

  • फ़ंक्शन getPar () को परिभाषित करें, इसमें एक लगेगा,

  • अगर माता-पिता [ए] एक के समान है, तो:

    • वापसी एक

  • माता-पिता [ए] =गेटपार (माता-पिता [ए])

  • माता-पिता को लौटाएं[ए]

  • एक फ़ंक्शन को परिभाषित करें (), इसमें a, b,

    . लगेगा
  • पैरा:=गेटपार (ए), पैराबी:=गेटपार (बी)

  • अगर पैरा, पैराबी के बराबर नहीं है, तो:

    • माता-पिता [पैरा] :=parB

    • सही लौटें

  • झूठी वापसी

  • फ़ंक्शन को परिभाषित करें ठीक है (), इसमें a, b,

    . लगेगा
  • सीएनटी:=0

  • प्रारंभ करने के लिए मैं:=0, जब मैं <आकार का, अद्यतन (मैं 1 से बढ़ाएँ), यह करें:

    • cnt :=cnt + (1 जब a[i] b[i] के समान नहीं है, अन्यथा 0)

  • सीएनटी 1 होने पर सही लौटें, अन्यथा गलत

  • मुख्य विधि से निम्न कार्य करें -

  • सरणी को क्रमबद्ध करें v

  • v

    . से तत्वों को लेकर एक सेट को परिभाषित करें
  • रिट:=वी का आकार

  • v में प्रत्येक तत्व के लिए, करें

    • माता-पिता [यह]:=यह

    • v में प्रत्येक तत्व के लिए, करें

    • प्रारंभ करने के लिए j :=0, जब j <इसका आकार, अद्यतन करें (1 से j बढ़ाएँ), करें:

      • अस्थायी:=यह

      • [ए, सी, जी, टी]

        . में प्रत्येक वर्ण x के लिए
        • अगर x इसके बराबर नहीं है[j], तो:

          • अस्थायी [जे]:=एक्स

          • यदि तापमान s में मौजूद है, तो:

            • अगर एकजुट (अस्थायी, यह), तो:

      • वापसी रिट

आइए बेहतर समझ पाने के लिए निम्नलिखित कार्यान्वयन देखें -

उदाहरण

#include <bits/stdc++.h>
using namespace std;
class Solution {
   public:
   map <string, string> parent;
   string getPar(string& a){
      if(parent[a] == a)
         return a;
      return parent[a] = getPar(parent[a]);
   }
   bool unite(string& a, string& b){
      string parA = getPar(a);
      string parB = getPar(b);
      if(parA != parB){
         parent[parA] = parB;
         return true;
      }
      return false;
   }
   bool ok(string &a, string& b){
      int cnt = 0;
      for(int i = 0; i < a.size(); i++){
         cnt += a[i] != b[i];
      }
      return cnt == 1;
   }
   int solve(vector<string> v) {
      sort(v.begin(), v.end());
      set <string> s(v.begin(), v.end());

      int ret = v.size();
      for(auto& it : v){
         parent[it]= it;
      }
      for(auto& it : v){
         for(int j = 0; j < it.size(); j++){
            string temp = it;
            for(char x : {'A', 'C', 'G', 'T'}){
               if(x != it[j]){
                  temp[j] = x;
                  if(s.count(temp)){
                     if(unite(temp, it)) ret--;
                  }
               }
            }
         }
      }
      return ret;
   }
};
main(){
   vector<string> v = {"ACGT", "ACGC", "ACTT", "TTTT", "TGTT"};
   Solution(ob);
   cout << ob.solve(v);
}

इनपुट

{"ACGT", "ACGC", "ACTT", "TTTT", "TGTT"}

आउटपुट

2

  1. C++ में एक लाइन के मध्य-बिंदु को खोजने का प्रोग्राम

    इस समस्या में, हमें दो बिंदु A और B दिए गए हैं, जो एक रेखा के आरंभ और अंत बिंदु हैं। हमारा काम C++ में एक लाइन के मध्य-बिंदु को खोजने के लिए एक प्रोग्राम बनाना है। समस्या का विवरण - यहाँ, हमारे पास एक रेखा है जिसमें शुरुआती और अंत बिंदु A(x1, y1) और B(x2, y2) हैं। और हमें रेखा के मध्य-बिंदु को खोजन

  1. C++ में त्रिभुज के केंद्रक को खोजने का कार्यक्रम

    इस समस्या में, हमें एक 2D सरणी दी गई है जो त्रिभुज के तीन शीर्षों के निर्देशांकों को दर्शाती है। हमारा काम C++ में त्रिभुज के Centroid को खोजने के लिए एक प्रोग्राम बनाना है। सेंट्रोइड त्रिभुज का वह बिंदु है जिस पर त्रिभुज की तीन माध्यिकाएं प्रतिच्छेद करती हैं। माध्यिका त्रिभुज की वह रेखा है जो त्र

  1. C++ में समांतर चतुर्भुज का क्षेत्रफल ज्ञात करने का कार्यक्रम

    इस समस्या में, हमें दो मान दिए गए हैं जो समांतर चतुर्भुज के आधार और ऊंचाई को दर्शाते हैं। हमारा कार्य C++ में समांतर चतुर्भुज का क्षेत्रफल ज्ञात करने के लिए एक प्रोग्राम बनाना है। समांतर चतुर्भुज एक चार भुजा बंद आकृति है जिसकी विपरीत भुजाएँ एक दूसरे के समान और समानांतर हैं। समस्या को समझने के लि