Реализация кода для симуляции недетерминированного конечного автомата в C++
Я делаю задание для теории автоматов, которое я должен определить, принимается ли слово функцией перехода для детерминированного конечного автомата
У меня есть этот входной файл:
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, представляющих состояния, в которых происходит переход, т. Е. Переход из состояния i в состояние J с символом C. После этой строки идет одно целое число S, которое будет содержать количество проверяемых строк, затем S строк с соответствующими строками.
Вывод этой программы должен быть:
Case #2:
aaabcccc Rejected
aabbbbcdc Rejected
acdddddd Accepted
Должно быть указано, принята строка или отклонена. So far, I've only coded the work with the input.
I don't know how would be most convenient to represent the automaton. Should I simply use arrays? What logic would I apply to the arrays?. Is there any way to do it without knowing in advance the automaton alphabet? Do I need a data structure to represent automata?. I am a little stuck with this assignment, and would like some ideas, some pseudocode or ideas to do it. Is the code in another language? I do not want the solution, because I want to do my assignment but if I could use some help
1 ответ
Я думаю, что вы можете иметь картуtr
для переходов где tr[(i, c)] = j
если есть переход от i
государство для j
состояние через c
, массив для конечных состояний fs[m]
где m
число конечных состояний и целое число для начального состояния s0
,
Сильфон - это рамка класса с такими свойствами:
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
};