Пусть слово - это последовательность от 1 до 8 символов, не включающая пробелов.
Вводится n слов A1,...,An. Можно ли их переупорядочить так, чтобы получилась "цепочка", т.е. для каждого слова Aj его первая буква должна совпадать с последней буквой предыдущего слова, а последняя буква в Aj - с первой буквой последующего слова; соответственно последняя буква последнего слова должна совпадать с первой буквой первого слова. В цепочку входят все n слов без повторений.
Дать ответ в виде "Можно"\"Нельзя".
Если такое упорядочение возможно, то вывести какую-нибудь цепочку слов. Слова при выводе разделяются пробелами.
Мой код правильно определяет можно ли создать цепочку или нет, но не правильно выводит саму цепочку(не все слова и слова повторяются):#include <iostream>
#include <string>
#include <fstream>
#include <cstring>

using namespace std;

// Структура для хранения слов
struct Word {
    char value[9];
    char first;
    char last;
};

// Функция для чтения слов из файла
void readWordsFromFile(const char* filename, Word* words, int* n) {
    ifstream file(filename);
    if (!file.is_open()) {
        cerr << "Ошибка открытия файла" << endl;
        exit(1);
    }

    *n = 0;
    char word[9];
    while (file >> word) {
        if (strlen(word) > 8) {
            cerr << "Слово слишком длинное. Максимальная длина - 8 символов." << endl;
            continue;
        }

        for (int i = 0; i < strlen(word); ++i) {
            if (!isalpha(word[i])) {
                cerr << "Слово содержит недопустимые символы. Разрешены только буквы." << endl;
                continue;
            }
        }

        strcpy_s(words[*n].value, word);
        words[*n].first = word[0];
        words[*n].last = word[strlen(word) - 1];
        (*n)++;
    }

    file.close();
}

// Функция для чтения слов с клавиатуры
void readWordsFromConsole(Word* words, int* n) {
    cout << "Введите количество слов: ";
    if (!(cin >> *n) || *n <= 0) {
        cerr << "Недопустимое количество слов. Введите целое число больше 0." << endl;
        exit(1);
    }
    cin.ignore();

    for (int i = 0; i < *n; ++i) {
        cout << "Введите слово " << i + 1 << ": ";
        cin.getline(words[i].value, 9);
        if (strlen(words[i].value) > 8) {
            cerr << "Слово слишком длинное. Максимальная длина - 8 символов." << endl;
            i--;
            continue;
        }

        for (int j = 0; j < strlen(words[i].value); ++j) {
            if (!isalpha(words[i].value[j])) {
                cerr << "Слово содержит недопустимые символы. Разрешены только буквы." << endl;
                i--;
                continue;
            }
        }

        words[i].first = words[i].value[0];
        words[i].last = words[i].value[strlen(words[i].value) - 1];
    }
}

bool canFormEulerianCycle(int n, int hashTable[100][100], Word* words) {
    // Проверяем условия цикла
    int inDegree[26] = { 0 }, outDegree[26] = { 0 };

    for (int i = 0; i < n; i++) {
        outDegree[words[i].first - 'a']++;
        inDegree[words[i].last - 'a']++;
    }

    for (int i = 0; i < 26; i++) {
        if (inDegree[i] != outDegree[i]) {
            return false;
        }
    }
    return true;
}

void findChain(int n, int hashTable[100][100], Word* words) {
    // Проверяем возможность создания цепочки
    for (int i = 0; i < n; i++) {
        int current = i;
        int cycle[100];
        cycle[0] = current;
        int pos = 1;

        while (pos < n) {
            for (int j = 0; j < n; j++) {
                if (hashTable[current][j] == 1 && cycle[pos - 1] != j) {
                    cycle[pos] = j;
                    current = j;
                    pos++;
                    break;
                }
            }
        }

        // Проверка, что последний элемент связывается с первым
        if (pos == n && hashTable[cycle[n - 1]][cycle[0]] == 1) {
            cout << "Можно" << endl;
            for (int i = 0; i < n; i++) {
                cout << words[cycle[i]].value << " ";
            }
            cout << endl;
            return;
        }
    }

    cout << "Нельзя" << endl;
}

int main() {
    //setlocale(LC_ALL, "Russian");
    char filename[256];
    cout << "Введите имя файла или 'c' для ввода с клавиатуры: ";
    cin.getline(filename, 256);

    Word words[100];
    int n;
    if (filename[0] == 'c') {
        readWordsFromConsole(words, &n);
    }
    else {
        readWordsFromFile(filename, words, &n);
    }

    if (n == 0) {
        cout << "Нельзя" << endl;
        return 0;
    }

    int hashTable[100][100] = { {0} };

    // Заполнение таблицы смежности
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            if (words[i].last == words[j].first) {
                hashTable[i][j] = 1;
            }
        }
    }

    // Проверяем, можно ли построить цикл
    if (!canFormEulerianCycle(n, hashTable, words)) {
        cout << "Нельзя" << endl;
        return 0;
    }

    // Пытаемся найти цепь
    findChain(n, hashTable, words);

    return 0;
} при выполнении нельзя использовать библиотеки шаблонов