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

C++-এ ক্রিপ্টারিথমেটিক পাজল সমাধান (Solving Cryptarithmetic Puzzles)


ক্রিপ্ট-এরিথমেটিক সমস্যায়, কিছু লেটার ব্যবহার করে ডিজিট অ্যাসাইন করা হয়। যেমন দশটি ভিন্ন লেটার ০ থেকে ৯ পর্যন্ত ডিজিট ভ্যালু ধারণ করে যাতে অ্যারিথমেটিক অপারেশন সঠিক হয়। দুটি শব্দ দেওয়া থাকে এবং একটি শব্দ দেওয়া থাকে যেটি সেই দুটি শব্দের যোগফল হিসেবে উত্তর। উদাহরণস্বরূপ, 'BASE' এবং 'BALL' দুটি শব্দ, এবং ফলাফল 'GAMES'। এখন যদি আমরা BASE এবং BALL তাদের সিম্বলিক ডিজিট দিয়ে যোগ করতে চাই, তবে আমরা GAMES পাব।

নোট - সর্বোচ্চ দশটি লেটার থাকতে হবে, অন্যথায় সমাধান সম্ভব নয়।

ইনপুট

এই অ্যালগরিদম তিনটি শব্দ নেবে।

C++-এ ক্রিপ্টারিথমেটিক পাজল সমাধান (Solving Cryptarithmetic Puzzles)

আউটপুট

এটি দেখাবে কোন লেটার ০-৯ থেকে কোন নম্বর ধারণ করে।

এই কেসে এটি নিচের মতো।

LetterABEGLMS
Values4210596


 

C++-এ ক্রিপ্টারিথমেটিক পাজল সমাধান (Solving Cryptarithmetic Puzzles)

অ্যালগরিদম

এই সমস্যার জন্য, আমরা একটি নোড ডিফাইন করব, যেটি একটি লেটার এবং এর সংশ্লিষ্ট ভ্যালু ধারণ করবে।

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

ইনপুট - নোডের লিস্ট, নোড লিস্টে এলিমেন্টের সংখ্যা এবং তিনটি শব্দ।
আউটপুট - True যদি word1 এবং word2-এর ভ্যালুর যোগফল word3-এর ভ্যালুর সমান হয়।

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

permutation(nodeList, count, n, word1, word2, word3)

ইনপুট - নোডের লিস্ট, লিস্টে আইটেমের সংখ্যা, অ্যাসাইন করা লেটারের সংখ্যা এবং তিনটি শব্দ।
আউটপুট - True যখন সব লেটার সঠিক ভ্যালু দিয়ে অ্যাসাইন করা হয়েছে যোগফল সমাধান করার জন্য।

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 false
    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); // ১ সেট করুন, যখন একটা ক্যারেক্টার অ্যাসাইন করা হয়
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--){ // প্রথম স্ট্রিং-এর জন্য নম্বর বের করুন
        char ch = s1[i];
        for (j = 0; j < count; j++)
            if (nodeList[j].letter == ch) // যখন ch পাওয়া যায়, লুপ ব্রেক
                break;
        val1 += m * nodeList[j].value;
        m *= 10;
    }
    m = 1;
    for (i = s2.length() - 1; i >= 0; i--){ // দ্বিতীয় স্ট্রিং-এর জন্য নম্বর বের করুন
        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--){ // তৃতীয় স্ট্রিং-এর জন্য নম্বর বের করুন
        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)) // চেক করুন যোগফল ৩য় স্ট্রিংয়ের সমান কিনা
        return 1;
    return 0;
}
bool permutation(int count, node* nodeList, int n, string s1, string s2, string s3) {
    if (n == count - 1){ // যখন সব ক্যারেক্টারের জন্য ভ্যালু অ্যাসাইন করা হয়েছে
        for (int i = 0; i < 10; i++){
            if (use[i] == 0){ // যেসব নম্বর ব্যবহার করা হয়নি
                nodeList[n].value = i; // ভ্যালু i অ্যাসাইন
                if (isValid(nodeList, count, s1, s2, s3) == 1){ // ভ্যালিডেশন চেক
                    cout << "Solution found: ";
                    for (int j = 0; j < count; j++) // অ্যাসাইন করা কোড প্রিন্ট
                        cout << " " << nodeList[j].letter << " = " << nodeList[j].value;
                    return true;
                }
            }
        }
        return false;
    }
    for (int i = 0; i < 10; i++){
        if (use[i] == 0){ // যেসব নম্বর ব্যবহার করা হয়নি
            nodeList[n].value = i; // ভ্যালু i অ্যাসাইন এবং ভবিষ্যতের জন্য অনভ্যাবল মার্ক
            use[i] = 1;
            if (permutation(count, nodeList, n + 1, s1, s2, s3)) // নেক্সট ক্যারেক্টারের জন্য যান
                return true;
            use[i] = 0; // যখন ব্যাকট্র্যাক, আবার অভ্যাবল করুন
        }
    }
    return false;
}
bool solvePuzzle(string s1, string s2, string s3) {
    int uniqueChar = 0; // ইউনিক ক্যারেক্টার সংখ্যা
    int len1 = s1.length();
    int len2 = s2.length();
    int len3 = s3.length();
    vector<int> freq(26); // ২৬টি ভিন্ন ক্যারেক্টার আছে
    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) // যেসব ফ্রিকোয়েন্সি > 0, সেগুলো উপস্থিত
            uniqueChar++;
    if (uniqueChar > 10) { // ডেসিমেল সিস্টেমে ১০টি ডিজিট আছে
        cout << "Invalid strings";
        return 0;
    }
    node nodeList[uniqueChar];
    for (int i = 0, j = 0; i < 26; i++) { // তিনটি স্ট্রিংয়ে পাওয়া যাবে সব ক্যারেক্টার অ্যাসাইন
        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. C++-এ পিরামিডের ভলিউম বের করার প্রোগ্রাম

  2. C++-এ অক্টাহেড্রনের সারফেস এরিয়া বের করার প্রোগ্রাম

  3. C++-এ ডোডেকাহেড্রনের সারফেস এরিয়া বের করার প্রোগ্রাম

  4. C++-এ কুইকসর্ট (QuickSort) প্রোগ্রাম