10

我正在为自动机理论做作业,我必须确定一个词是否被确定性有限自动机的转移函数接受

我有这个输入文件:

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

它应该说明字符串是被接受还是被拒绝。到目前为止,我只使用输入对工作进行了编码。

我不知道如何最方便地表示 automaton。我应该简单地使用数组吗?我会对数组应用什么逻辑?在事先不知道自动机字母表的情况下,有什么办法可以做到吗?我需要一个数据结构来表示自动机吗?我对这个任务有点坚持,并且想要一些想法,一些伪代码或想法来完成它。代码是另一种语言吗?我不想要解决方案,因为我想做我的任务,但如果我可以使用一些帮助

4

1 回答 1

5

我认为你可以有一个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
};
于 2012-05-14T07:58:59.710 回答