В игре Tic-Tac-Toe 9! = 362880 возможных досок, игнорируя игрока, рано выигравшего. Поэтому из этих 362880 плат должно быть 8 * 3! * 6! = 34560 игр, в которых первый игрок имеет три камня в линии к 5-му ходу. К сожалению, хотя приведенный ниже код насчитывает только 21600 плат.
Кто-то видит ошибку?
all_boards = list()
winning_boards = [[1, 2, 3],
[4, 5, 6],
[7, 8, 9],
[1, 4, 7],
[2, 5, 8],
[3, 6, 9],
[1, 5, 9],
[3, 5, 7]]
def build_all_boards(cur, moves_left):
if moves_left == 0:
all_boards.append(cur)
return
for i in range(1, 10):
if i in cur:
continue
else:
temp = cur.copy()
temp.append(i)
build_all_boards(temp, moves_left - 1)
def check_win(moves):
for winning_board in winning_boards:
s1 = set(moves)
s2 = set(winning_board)
if s1 == s2:
return True
return False
def count(c):
build_all_boards([], c)
won_boards = list()
for board in all_boards:
temp = board[::2][:3]
if check_win(temp):
won_boards.append(temp)
print(len(won_boards))
count(9)
РЕДАКТИРОВАТЬ: Фиксированный код.