DFA为Tic Tac Toe游戏

时间:2016-05-07 08:51:23

标签: theory tic-tac-toe finite-automata computation-theory dfa

我想制作一个为Tic Tac Toe制作DFA的c ++程序,只接受第一个玩家获胜。我有工作代码,它正在生成DFA。我还有一个计算状态数的函数。我有2,203,642个州,但我不确定这是对还是错。谁能告诉我我应该有多少州?

1 个答案:

答案 0 :(得分:1)

我不确定我是否完全理解这个问题,但我可以根据自己的理解来回答。

我们需要做的第一件事是模拟Tic Tac Toe游戏。这样做没有正确或错误的方法。我提出以下模型:Tic-Tac-Toe游戏是一个长度为9的字符串,由0s,1s和2s组成。 0s对应于无人认领的位置,1s对应于玩家1所声称的位置,2s对应于玩家2所声称的位置。对应于位置,通过从左到右,然后从上到下的位置对应于位置。玩家1赢得此游戏:122010001;输掉这场比赛:100222110;这个游戏无效111222111

所以我们正在寻找DFA来识别玩家1获胜的有效游戏。如果(a)至少有一个玩家没有获胜并且(b)两个玩家的移动次数相同或玩家1的移动次数多于玩家2,则游戏有效。玩家1在任何一个案例中获胜:

  • 111SSSSSS
  • SSS111SSS
  • SSSSSS111
  • 1SS1SS1SS
  • S1SS1SS1S
  • SS1SS1SS1
  • 1SSS1SSS1
  • SS1S1S1SS

此处,S代表任何符号0, 1, 2。所以,这是制作DFA的一种方法:

  1. 编写一个DFA,接受上面列表中8个正则表达式描述的语言的并集。

  2. 将DFA从1复制,但是对于玩家2获胜而不是玩家1.现在,通过将状态从接受切换为不接受来反对DFA,反之亦然。

  3. 通过考虑从步骤1和2获得的DFA的交集来构建笛卡尔积计机。此DFA现在识别“玩家1获胜而玩家2没有”。

  4. 现在构建一个新的DFA来识别移动的数量是否有效。我们将有100个状态:玩家1的10个移动计数和玩家2的10个移动计数。标记为接受对应于#1 =#2或#1 =#2 + 1的状态(应该有20个这样的状态)。

  5. 使用交叉点构建来自步骤3和4的机器的笛卡尔积机器以确定接受状态。由此产生的DFA确切地识别出玩家1获胜且玩家2输了的有效游戏。

  6. 注意:在每个步骤之后,您可以最小化生成的DFA,以使笛卡尔积计算机结构具有更少的状态。此外,您可以将步骤5中的机器最小化,以使尽可能小的DFA接受该语言。

    可能不是非常有用,但是如果你编写一个程序来生成上面列出的DFA,然后让程序在整个过程中最小化DFA,那么你应该得到正确的答案。