BFS подготовит побег кроликов

#python-3.x #python-2.7 #search #multidimensional-array #breadth-first-search

#python-3.x #python-2.7 #Поиск #многомерный массив #поиск по ширине

Вопрос:

Подсказка

У вас есть карты частей космической станции, каждая из которых начинается у выхода из тюрьмы и заканчивается у двери в спасательную капсулу. Карта представлена в виде матрицы из 0 и 1, где 0 — проходимое пространство, а 1 — непроходимые стены. Дверь из тюрьмы находится вверху слева (0,0), а дверь в спасательную капсулу — внизу справа (w-1, h-1).

Напишите функциональный ответ (map), который генерирует длину кратчайшего пути от двери тюрьмы до спасательной капсулы, где вам разрешено удалить одну стену в рамках ваших планов реконструкции. Длина пути — это общее количество узлов, через которые вы проходите, считая как входные, так и выходные узлы. Начальная и конечная позиции всегда проходимы (0). Карта всегда будет разрешима, хотя вам может понадобиться или не понадобиться удалять стену. Высота и ширина карты могут быть от 2 до 20. Ходы могут быть сделаны только в кардинальных направлениях; диагональные ходы не допускаются.

Тестовые примеры

 maze = [
    [0, 0, 1, 1, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 1, 1, 0],
    [1, 1, 1, 1, 0, 1, 1, 1],
    [1, 1, 1, 1, 0, 1, 1, 1],
    [1, 0, 0, 0, 0, 1, 0, 1],
    [1, 0, 1, 1, 1, 1, 0, 0],
    [1, 0, 1, 1, 1, 1, 1, 0],
    [1, 0, 0, 0, 0, 0, 0, 0]
]
#15

maze = [
    [0, 0, 1, 1, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 1, 1, 0],
    [1, 1, 1, 1, 0, 1, 1, 1],
    [1, 1, 1, 1, 0, 1, 1, 1],
    [1, 0, 0, 0, 0, 1, 0, 1],
    [1, 0, 1, 1, 1, 1, 1, 0],
    [1, 0, 1, 1, 1, 1, 1, 0],
    [1, 0, 0, 0, 0, 0, 0, 0]
]
#21

maze = [
    [0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0],
    [1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
    [1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0],
    [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
    [0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1],
    [0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
]
#39

maze = [
    [0, 1, 0, 1, 0, 0, 0],
    [0, 0, 0, 1, 0, 1, 0]
]
#10
  

Мой код

 from collections import deque


def solution(map):
    H = len(map)
    W = len(map[0])
    start = ((0, 0), False)

    track = {
        (0, 0): (-1, -1)
    }
    to_explore = deque([start])
    visited = set()
    w, h = 0, 0
    while not (w == W-1 and h == H-1):
        current = to_explore.popleft()
        pos, opened = current
        neighbours = get_neighbours(pos)
        zeroes, ones = check_neighbours(neighbours, map, (W, H))
        for node in zeroes:
            if not node in track and node not in visited:
                form_vertex = (node, opened)
                to_explore.append(form_vertex)
                track[node] = pos
        for node in ones:
            if not node in track and node not in visited and not opened:
                form_vertex = (node, True)
                to_explore.append(form_vertex)
                track[node] = pos
        w, h = pos
        visited.add(pos)

    path = []
    current = (W - 1, H - 1)
    while current != (-1, -1):
        path.append(current)
        current = track[current]
    return len(path)


def get_neighbours(pos):
    w, h = pos
    return [(w 1, h), (w-1, h), (w, h 1), (w, h-1)]


def check_neighbours(neighbours, grid, edge):
    zeroes = []
    ones = []
    W, H = edge
    for neighbour in neighbours:
        w, h = neighbour
        if 0 <= w < W and 0 <= h < H:
            value = grid[h][w]
            if value == 0:
                zeroes.append(neighbour)
            else:
                ones.append(neighbour)

    return zeroes, ones
  

Проблема

Насколько я могу судить, код работает. Он проходит все тестовые примеры, которые я бросил на него. Однако он не выполняет два скрытых тестовых примера Google. Может кто-нибудь определить проблему и сказать мне, чего мне не хватает, потому что я исчерпал свои собственные идеи и, похоже, не могу найти, что именно не так.
!! Даже если вы не можете найти решение, неудачные тестовые примеры приветствуются

Комментарии:

1. Не могли бы вы объяснить, что вы подразумеваете под «скрытыми тестовыми примерами Google»?

2. @RichardHunter Да. Таким образом, мы (пользователь) знаем входные данные некоторых тестовых примеров, однако есть некоторые тестовые примеры, входные данные которых скрыты. Я думаю, это делается для того, чтобы люди не могли использовать жесткие решения, но недостатком является то, что я не могу точно сказать, с какой ошибкой / ошибкой сталкивается мой код.