Внедрение кода для моделирования конечного автомата, недетерминированного в С++

Я выполняю задание для теории автоматов, которое я должен определить, принимается ли слово или нет функцией перехода для детерминированного конечного автомата

У меня есть этот входной файл:

6 8 0 2
2
5
0 0 a
0 1 a
1 1 b
1 2 c
1 3 c
3 4 d
4 4 d
4 5 d
3
aaabcccc
aabbbbcdc
acdddddd

Ввод начинается с 4 целых чисел, первым является число состояний для автомата, затем число переходов автомата, третье число - начальное состояние, а затем число конечных состояний. затем приходят конечные состояния (в примере конечные состояния равны 2 и 5).

Затем наберите N строк (N - количество переходов), каждая из которых имеет 2 целых числа и символ I, J и C, представляющие состояния, в которых переход, т.е. переход переходит из состояния я в состояние J с символ C. После этой строки вы получите единственное целое число S, которое будет содержать количество строк для проверки, затем S строк с соответствующими строками.

Выход этой программы должен быть:

Case #2:
aaabcccc Rejected
aabbbbcdc Rejected
acdddddd Accepted

Он должен сказать, принимается или отклоняется String. До сих пор я только кодировал работу с вводом.

Я не знаю, как было бы наиболее удобно представлять автомат. Должен ли я просто использовать массивы? Какую логику я бы применил к массивам?. Есть ли способ сделать это, не зная заранее автомат-алфавит? Мне нужна структура данных для представления автоматов?. Я немного застрял в этом задании и хотел бы, чтобы некоторые идеи, некоторые псевдокоды или идеи сделали это. Является ли код на другом языке? Я не хочу решения, потому что я хочу выполнить свое задание, но если бы я мог использовать некоторую помощь

Ответ 1

Я думаю, вы можете иметь карту tr для переходов, где tr[(i, c)] = j, если переход из состояния i в состояние j через c, массив для конечных состояний fs[m], где m - число конечных состояний и целое число для начального состояния s0.

Bellow - это кадр класса с такими свойствами:

class Automata
{
public:
    Automata(int start) : s0(start)
    {}

    void add_transition(int i, int j, char c) {
        //...
    }

    void add_final_state(int i) {
        //...
    }

    bool validate_string(const std::string& str) {
        //...
    }
private:
    std::map<std::pair<int, char>, int> tr; // transitions
    std::vector<int> fs; // final states
    int s0; // initial state
};