【发布时间】:2022-07-18 22:36:28
【问题描述】:
Wild tic-tac-toe 是一款类似于 tic-tac-toe 的中立游戏。然而,在这个游戏中,玩家可以选择在每一步中放置 X 或 O 更改该规则后所有可能的状态是什么?
【问题讨论】:
标签: python combinatorics tic-tac-toe
Wild tic-tac-toe 是一款类似于 tic-tac-toe 的中立游戏。然而,在这个游戏中,玩家可以选择在每一步中放置 X 或 O 更改该规则后所有可能的状态是什么?
【问题讨论】:
标签: python combinatorics tic-tac-toe
这是对蛮力来说实际上足够简单的问题之一
只有 3**9 或 19,683 种将 x、o 或置于网格中的可能组合,并且并非所有这些都有效。
首先,经典井字游戏中的有效游戏位置是 x 和 o 计数之间的差不超过 1,因为它们必须交替移动,但这里不是这种情况。
另外,不可能有双方连续三个的状态,所以也可以打折。如果两者都连续三个,那么他们中的一个会在上一步中获胜。
实际上还有另一个限制,一个字母 X 或 O 不可能在没有公共单元的情况下以两种不同的方式获胜(同样,它们会在上一步中获胜),这意味着:
XXX
OOO
XXX
无法实现,而:
XXX
OOX
OOX
有道理。
所以唯一无效的状态是我们在同一方向(垂直或水平)有两条获胜线的状态
代码如下:
import numpy as np
a = [['X', 'O', 'O'], ['X', 'O', 'X'], ['X', 'X', 'O']]
def checkRows(board):
i = -1
for row in board:
i += 1
if len(set(row)) == 1 and set(row) != {''}:
r = row[0]
board[i][0] = board[i][1] = board[i][2] = ''
return r
return 0
def checkinvalide(board):
for newBoard in [board, np.transpose(board)]:
k = 0
result = checkRows(newBoard)
if result:
k += 1
result = checkRows(newBoard)
if result:
k += 1
if k == 2:
return k
return k
def generatelists():
StatesMatrix = np.zeros((3**9,9))
for i in range(3**9):
c = i
for j in range(9):
StatesMatrix[i][j] = c % 3
c //= 3
k = 0
e = 0
dic = {}
for i in StatesMatrix:
e += 1
i = ["X" if item == 1 else item for item in i]
i = ["O" if item == 2 else item for item in i]
i = ["" if item == 0 else item for item in i]
dd_board = np.reshape(i, (3, 3))
result = checkinvalide(dd_board)
if result != 2:
dic.update({tuple(i): 0})
k += 1
print(k)
return dic
generatelists()
执行代码会生成 19177 个状态
【讨论】: