Алгоритм решения криптарифм на языке программирования с++

Помогите пожалуйста исправить небольшую неточность в программе. Программа должна решать криптарифм (классический пример - send+more=money будет 9567+1085=10652). Моя же программа решает данный криптарифм так - 7531+0825=08356 , то есть d = 1 e = 5 m = 0 n = 3 o = 8 r = 2 s = 7 y = 6 , как вы видите второе слагаемое и ответ начинается с 0 , что запрещено правилами криптарифмов (числа не могут начинаться с 0). Искал в русскоязычном интернете , ничего не нашел . А на зарубежных ресурсах все решения такие же как и у меня (7531+0825=08356 , например https://www.geeksforgeeks.org/c-code-article-backtracking-set-8-solving-cryptarithmetic-puzzles/). Помогите пожалуйста исправить код программы так , чтобы числа не начинались на 0 (получить корректный ответ 9567+1085=10652) Код:

#include <bits/stdc++.h>
using namespace std;
vector<int> use(10);
struct node  //структура для хранения символа и соответств. ему числа
{ 
    char c; 
    int v; 
};
int check(node* nodeArr, 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 (nodeArr[j].c == ch) 
                break; 

        val1 += m * nodeArr[j].v; 
        m *= 10; 
    } 
    m = 1; 
    for (i = s2.length() - 1; i >= 0; i--) 
    { 
        char ch = s2[i]; 
        for (j = 0; j < count; j++) 
            if (nodeArr[j].c == ch) 
                break; 

        val2 += m * nodeArr[j].v; 
        m *= 10; 
    } 
    m = 1; 
    for (i = s3.length() - 1; i >= 0; i--) 
    { 
        char ch = s3[i]; 
        for (j = 0; j < count; j++) 
            if (nodeArr[j].c == ch) 
                break; 

        val3 += m * nodeArr[j].v; 
        m *= 10; 
    } 

    if (val3 == (val1 + val2)) 
    {
        cout << "Ответ-"<< val3;
        return 1; 
    }

    return 0; 
} 
bool permutation(const int count, node* nodeArr, int n, string s1, string s2, string s3) //рекурсивный алгоритм
{  
    if (n == count - 1) 
    { 
        for (int i = 0; i < 10; i++) 
        { 
            if (use[i] == 0) 
            { 
                nodeArr[n].v = i; 
                if (check(nodeArr, count, s1, s2, s3) == 1) 
                { 
                    cout << "\n Решение: ";
                    for (int j = 0; j < count; j++) 
                        cout << " " << nodeArr[j].c << " = "
                             << nodeArr[j].v; 
                    return true; 
                } 
            } 
        } 
        return false; 
    } 

    for (int i = 0; i < 10; i++) 
    { 
        if (use[i] == 0) 
        { 
            nodeArr[n].v = i;  
            use[i] = 1; 

            if (permutation(count, nodeArr, n + 1, s1, s2, s3)) 
                return true; 

            use[i] = 0; 
        } 
    } 
    return false; 
} 

bool solveCryptographic(string s1, string s2, string s3) 
{ 
    int count = 0; 
    int l1 = s1.length(); 
    int l2 = s2.length(); 
    int l3 = s3.length(); 

    vector<int> freq(152); 

    for (int i = 0; i < l1; i++) 
        ++freq[s1[i] - 'A']; 

    for (int i = 0; i < l2; i++) 
        ++freq[s2[i] - 'A']; 

    for (int i = 0; i < l3; i++) 
        ++freq[s3[i] - 'A']; 

    for (int i = 0; i < 152; i++) 
        if (freq[i] > 0) 
            count++; 

    if (count > 10) 
    { 
        cout << "Некорректная строка"; 
        return 0; 
    } 

    node nodeArr[count];  
    for (int i = 0, j = 0; i < 152; i++) 
    { 
        if (freq[i] > 0) 
        { 
            nodeArr[j].c = char(i + 'A'); 
            j++; 
        } 
    } 
    return permutation(count, nodeArr, 0, s1, s2, s3); 
}

void help()
{
    cout<<"эта программа решает крипторифмы"<<endl;
    cout<<"вводите слова либо прописными буквами, либо строчными буквами "<<endl;       
}


int main()
{
    setlocale (LC_ALL,"russian");
    srand (time(NULL));
    help ();
    string s1 ; 
    string s2 ; 
    string s3 ; 
    cout<<"Введите строку 1 - ";
    cin >> s1;
    cout<<"Введите строку 2 - ";
    cin >> s2;
    cout<<"Введите строку 3 - ";
    cin >> s3;
    if (solveCryptographic(s1, s2, s3) == false) 
        cout << "Нет решения"; 
    return 0; 
}

пример


Ответы (1 шт):

Автор решения: Harry

Добавьте соответствующую проверку в check:

int check(node* nodeArr, const int count, string s1, string s2, string s3) //метод...
{
    for(int j = 0; j < count; ++j)
    {
        if (nodeArr[j].v == 0 &&
            (nodeArr[j].c == s1[0] || 
             nodeArr[j].c == s2[0] || 
             nodeArr[j].c == s3[0])) return 0;
    }

    ...
→ Ссылка