Python,383个字符
M=[21,1344,86016,4161,16644,66576,65793,4368]
X=lambda B,k:any(m*k==B&m*3for m in M)
def S(B):
if X(B,2):return 1,
M=[i for i in range(0,18,2)if B>>i&3<2]
return max((-S((B|3<<i)^87381)[0],i)for i in M)if M else(0,)
r='D'
c=ord(raw_input())&1
B=0
for i in range(9):
if i&1==c:m=S(B^c*87381)[1];print m/2;B|=3-c<<m
else:
B|=2+c<<input()*2
if X(B,2+c):r='XO'[c];break
print r
该板B
被表示为使用每平方两个位,用一个整数00
和01
代表空的,10
代表O和11
表示X. M
是一组位掩码的与01
在丢失的三元组(的斑点21
= 0b010101
=顶行等) X
,如果任何丢失单位计算k
存在于板上的三元组。S
会执行minimax搜索X的最佳移动,并返回一对得分(1 =胜利,-1 =失败,0 =平局)和平方指数。 ^87381
(= ^0b010101010101010101
)翻转X和O,同时保持空白正方形不变。
电脑永远不会丢失,所以我不需要包括这张支票:)。
可能存在一个更容易/更短的基于规则的算法,但这是可行的。