Подсчет конкретных игр в крестики-нолики - PullRequest
1 голос
/ 03 ноября 2019

В игре 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)

РЕДАКТИРОВАТЬ: Фиксированный код.

...