我想制作一个为Tic Tac Toe制作DFA的c ++程序,只接受第一个玩家获胜。我有工作代码,它正在生成DFA。我还有一个计算状态数的函数。我有2,203,642个州,但我不确定这是对还是错。谁能告诉我我应该有多少州?
答案 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的一种方法:
编写一个DFA,接受上面列表中8个正则表达式描述的语言的并集。
将DFA从1复制,但是对于玩家2获胜而不是玩家1.现在,通过将状态从接受切换为不接受来反对DFA,反之亦然。
通过考虑从步骤1和2获得的DFA的交集来构建笛卡尔积计机。此DFA现在识别“玩家1获胜而玩家2没有”。
现在构建一个新的DFA来识别移动的数量是否有效。我们将有100个状态:玩家1的10个移动计数和玩家2的10个移动计数。标记为接受对应于#1 =#2或#1 =#2 + 1的状态(应该有20个这样的状态)。
使用交叉点构建来自步骤3和4的机器的笛卡尔积机器以确定接受状态。由此产生的DFA确切地识别出玩家1获胜且玩家2输了的有效游戏。
注意:在每个步骤之后,您可以最小化生成的DFA,以使笛卡尔积计算机结构具有更少的状态。此外,您可以将步骤5中的机器最小化,以使尽可能小的DFA接受该语言。
可能不是非常有用,但是如果你编写一个程序来生成上面列出的DFA,然后让程序在整个过程中最小化DFA,那么你应该得到正确的答案。