головоломка генерировать преемников из ходов 8 - PullRequest
0 голосов
/ 07 февраля 2020
import copy

goalState = [[1,2,3],[4,5,6],[7,8,0]]

def find_zero_tile(state):
    for i in range(0, 3):
        for j in range(0, 3):
            if state[i][j] == 0:
                x = j
                y = i
    return (x,y)

def _get_legal_moves(state):
        """Returns list of tuples with which the free space may
        be swapped"""
        row, col = find_free_tile(state)
        freeSpaces = []

        if row > 0:
            freeSpaces.append((row - 1, col))
        if col > 0:
            freeSpaces.append((row, col - 1))
        if row < 2:
            freeSpaces.append((row + 1, col))
        if col < 2:
            freeSpaces.append((row, col + 1))

        return freeSpaces

def succ(state): #my attempt of succesor funtion, does not work, need help with this function
    lista = []
    r = copy.deepcopy(state)
    moves = _get_legal_moves(state)
    idx = find_free_tile(state)
    x = idx[0]
    y = idx[1]
    for row,col in moves:
        r[x][y] = moves[row,col]
        r[row][col] = 0
    lista.append(r)
    return list

Функция _get_legal_moves () возвращает список кортежей, содержащих свободные пробелы (нули). Например, в приведенном выше случае:

_get_legal_moves(goalState)
returns [(1, 2), (2, 1)]

Я хочу сгенерировать диктат преемников, поменять местами легальные ходы в исходное состояние и создать новое состояние в качестве значения dict. Я хочу, чтобы ключом dict был номер, который был заменен. Вот что я ожидаю от функции su cc ():

Desired output: { 6: [[1, 2, 3], [4, 5, 0], [7, 8, 6]], 8: [[1, 2, 3], [4, 5, 6], [7, 0, 8]]}

1 Ответ

0 голосов
/ 07 февраля 2020

Пара точек

  1. Переместить глубокую копию внутрь для l oop в качестве первой строки.
  2. Вы объявляете find_zero_tile, но используете find_free_tile.
  3. Для В этом случае вы можете внести следующие изменения в объявление и назначение. lista = {}, lista [move [row, col]] = r
...