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

क्रिप्टोरिथमेटिक पहेलियों को सुलझाने के लिए सी++ प्रोग्राम

क्रिप्ट-अंकगणितीय समस्या में, कुछ अक्षरों का उपयोग अंकों को निर्दिष्ट करने के लिए किया जाता है। जैसे दस अलग-अलग अक्षर अंकगणितीय संक्रियाओं को सही ढंग से करने के लिए 0 से 9 तक अंक मान धारण कर रहे हैं। दो शब्द दिए गए हैं और उन दो शब्दों के अतिरिक्त उत्तर के रूप में दूसरा शब्द दिया गया है। एक उदाहरण के रूप में हम कह सकते हैं कि दो शब्द 'BASE' और 'BALL', और परिणाम 'GAMES' है। अब यदि हम आधार और गेंद को उनके सांकेतिक अंकों से जोड़ने का प्रयास करें, तो हमें उत्तर GAMES प्राप्त होंगे।

नोट - अधिकतम दस अक्षर होने चाहिए, अन्यथा इसे हल नहीं किया जा सकता है।

इनपुट

इस एल्गोरिथम में तीन शब्द लगेंगे।

क्रिप्टोरिथमेटिक पहेलियों को सुलझाने के लिए सी++ प्रोग्राम

आउटपुट

यह दिखाएगा कि कौन सा अक्षर 0 - 9 से कौन सा नंबर रखता है।

इस मामले के लिए यह इस प्रकार है।

पत्र बी जी एल एम एस
मान 4 2 1 0 5 9 6


क्रिप्टोरिथमेटिक पहेलियों को सुलझाने के लिए सी++ प्रोग्राम

एल्गोरिदम

इस समस्या के लिए, हम एक नोड को परिभाषित करेंगे, जिसमें एक अक्षर और उसके संगत मान होंगे।

isValid(nodeList, count, word1, word2, word3)

इनपुट - नोड्स की सूची, नोड सूची में तत्वों की संख्या और तीन शब्द।
आउटपुट - सही है अगर शब्द 1 और शब्द 2 के मान का योग शब्द 3 मान के समान है।

Begin
   m := 1
   for each letter i from right to left of word1, do
      ch := word1[i]
      for all elements j in the nodeList, do
         if nodeList[j].letter = ch, then
            break
      done
      val1 := val1 + (m * nodeList[j].value)
      m := m * 10
   done
   m := 1
   for each letter i from right to left of word2, do
      ch := word2[i]
      for all elements j in the nodeList, do
         if nodeList[j].letter = ch, then
            break
      done
      val2 := val2 + (m * nodeList[j].value)
      m := m * 10
   done
   m := 1
   for each letter i from right to left of word3, do
      ch := word3[i]
      for all elements j in the nodeList, do
         if nodeList[j].letter = ch, then
            break
      done
      val3 := val3 + (m * nodeList[j].value)
      m := m * 10
   done
   if val3 = (val1 + val2), then
      return true
   return false
End

क्रमपरिवर्तन(नोडलिस्ट, गिनती, n, शब्द1, शब्द2, शब्द3)

इनपुट - नोड्स की सूची, सूची में मदों की संख्या, निर्दिष्ट अक्षरों की संख्या और तीन शब्द।
आउटपुट - सही है जब योग को हल करने के लिए सभी अक्षरों को मानों के साथ सही ढंग से असाइन किया जाता है।

Begin
   if n letters are assigned, then
      for all digits i from 0 to 9, do
         if digit i is not used, then
            nodeList[n].value := i
            if isValid(nodeList, count, word1, word2, word3) = true
               for all items j in the nodeList, do
                  show the letter and corresponding values.
               done
               return true
      done
      return fasle
   for all digits i from 0 to 9, do
      if digit i is not used, then
         nodeList[n].value := i
         mark as i is used
         if permutation(nodeList, count, n+1, word1, word2, word3),
            return true
         otherwise mark i as not used
   done
   return false
End

उदाहरण

#include <iostream>
#include<vector<
using namespace std;
vector<int< use(10); //set 1, when one character is assigned previously
struct node {
   char letter;
   int value;
};
int isValid(node* nodeList, const int count, string s1, string s2, string s3) {
   int val1 = 0, val2 = 0, val3 = 0, m = 1, j, i;
   for (i = s1.length() - 1; i >= 0; i--){ //find number for first string
      char ch = s1[i];
      for (j = 0; j < count; j++)
         if (nodeList[j].letter == ch) //when ch is present, break the loop
            break;
            val1 += m * nodeList[j].value;
            m *= 10;
   }
   m = 1;
   for (i = s2.length() - 1; i >= 0; i--){ //find number for second string
      char ch = s2[i];
      for (j = 0; j < count; j++)
         if (nodeList[j].letter == ch)
            break;
            val2 += m * nodeList[j].value;
            m *= 10;
   }
   m = 1;
   for (i = s3.length() - 1; i >= 0; i--){ //find number for third string
      char ch = s3[i];
      for (j = 0; j < count; j++)
         if (nodeList[j].letter == ch)
            break;
            val3 += m * nodeList[j].value;
            m *= 10;
   }
   if (val3 == (val1 + val2)) //check whether the sum is same as 3rd string or not
      return 1;
   return 0;
}
bool permutation(int count, node* nodeList, int n, string s1, string s2, string s3) {
   if (n == count - 1){ //when values are assigned for all characters
      for (int i = 0; i < 10; i++){
         if (use[i] == 0){ // for those numbers, which are not used
            nodeList[n].value = i; //assign value i
            if (isValid(nodeList, count, s1, s2, s3) == 1){ //check validation
               cout << "Solution found: ";
               for (int j = 0; j < count; j++) //print code, which are assigned
                  cout << " " << nodeList[j].letter << " = "
                  << nodeList[j].value;
               return true;
            }
         }
      }
      return false;
   }
   for (int i = 0; i < 10; i++){
      if (use[i] == 0){ // for those numbers, which are not used
         nodeList[n].value = i; //assign value i and mark as not available for future use
         use[i] = 1;
         if (permutation(count, nodeList, n + 1, s1, s2, s3)) //go for next characters
            return true;
            use[i] = 0; //when backtracks, make available again
      }
   }
   return false;
}
bool solvePuzzle(string s1, string s2,string s3) {
   int uniqueChar = 0; //Number of unique characters
   int len1 = s1.length();
   int len2 = s2.length();
   int len3 = s3.length();
   vector<int> freq(26); //There are 26 different characters
   for (int i = 0; i < len1; i++)
      ++freq[s1[i] - 'A'];
   for (int i = 0; i < len2; i++)
      ++freq[s2[i] - 'A'];
   for (int i = 0; i < len3; i++)
      ++freq[s3[i] - 'A'];
   for (int i = 0; i < 26; i++)
      if (freq[i] > 0) //whose frequency is > 0, they are present
         uniqueChar++;
   if (uniqueChar > 10) { //as there are 10 digits in decimal system
      cout << "Invalid strings";
      return 0;
   }
   node nodeList[uniqueChar];
   for (int i = 0, j = 0; i < 26; i++) { //assign all characters found in three strings
      if (freq[i] > 0) {
         nodeList[j].letter = char(i + 'A');
         j++;
      }
   }
   return permutation(uniqueChar, nodeList, 0, s1, s2, s3);
}
int main() {
   string s1 = "BASE";
   string s2 = "BALL";
   string s3 = "GAMES";
   if (solvePuzzle(s1, s2, s3) == false)
      cout << "No solution";
}

आउटपुट

Solution found: A = 4 B = 2 E = 1 G = 0 L = 5 M = 9 S = 6

  1. सी++ में ऑक्टाहेड्रोन के भूतल क्षेत्र के लिए कार्यक्रम

    ऑक्टाहेड्रोन क्या है? शब्द डोडेकेहेड्रॉन ग्रीक शब्दों से लिया गया है, जहां ऑक्टा का अर्थ है आठ और हेड्रॉन चेहरे को निर्दिष्ट करता है। ज्यामितीय में ऑक्टाहेड्रोन एक 3-डी प्लेटोनिक या आठ चेहरों वाला नियमित ठोस है। जैसे, अन्य आकृतियों के अष्टफलक में भी गुण होते हैं और वे हैं - 6 पॉलीहेड्रॉन शिखर 12 प

  1. सी++ में डोडेकाहेड्रॉन के सतह क्षेत्र के लिए कार्यक्रम

    डोडेकाहेड्रॉन क्या है? शब्द डोडेकाहेड्रॉन ग्रीक शब्दों से लिया गया है, जहां डोडेका का अर्थ है बारह और हेड्रॉन चेहरे को निर्दिष्ट करता है। ज्यामितीय में डोडेकाहेड्रॉन एक 3-डी प्लेटोनिक या बारह सपाट चेहरों वाला नियमित ठोस है। जैसे, अन्य आंकड़े डोडेकाहेड्रोन में भी गुण होते हैं और वे हैं - 20 पॉलीहेड

  1. QuickSort के लिए C++ प्रोग्राम?

    क्विकसॉर्ट एक छँटाई तकनीक है जो एक क्रमबद्ध सूची (सरणी) को क्रमबद्ध करने के लिए तुलना का उपयोग करती है। Quicksort को पार्टीशन एक्सचेंज सॉर्ट के रूप में भी जाना जाता है। यह एक स्थिर प्रकार नहीं है, क्योंकि समान प्रकार की वस्तुओं का सापेक्ष क्रम संरक्षित नहीं है। क्विकसॉर्ट एक सरणी पर काम कर सकता है,