-4

Задача №2. Вы очнулись в определённой ячейке (x1,y1) лабиринта, с его картой в руке. Карта показывает, что лабиринт представляет собой окружённый сплошной стеной прямоугольник высотой N и шириной M, состоящий из ячеек, каждая ячейка самого лабиринта – это проход 0 или стена 1. Перемещаться по лабиринту можно по горизонтали (меняя координату x) либо по вертикали (меняя координату y) на одну ячейку, перемещаться по диагонали (меняя за один шаг обе координаты) нельзя.

На карте отмечен выход, и он находится в ячейке с координатами (x2,y2).

Ваша задача – найти длину кратчайшего пути из ячейки пробуждения в ячейку выхода. В случае, если такого пути нет – нужно вывести 0

Входные данные (поступают в стандартный поток ввода)

Первая строка - целые числа N и M через пробел (2≤N≤500, 2≤M≤500)

Вторая строка – целые числа x1 и y1 через пробел (0≤x1≤499, 0≤y1≤499) – координаты точки пробуждения

Третья строка – целые числа x2 и y2 через пробел (0≤x2≤499, 0≤y2≤499) – координаты точки выхода

Далее N строк, на каждой из которых M чисел 0 или 1 через пробел

Нумерации осей в передаваемых значениях следуют слева направо для X и с первой полученной строки до последней для Y. По координатам (x1,y1) и (x2,y2) всегда будут проходы. Координаты точки входа и выхода не совпадают.

Все входные данные наших тестов всегда соблюдают указанные параметры, дополнительные проверки не требуются

Выходные данные (ожидаются в стандартном потоке вывода)

Одно целое число, длина кратчайшего пути из точки (x1,y1) в точку (x2,y2), или 0, если из одной точки нельзя попасть в другую

Пример 1

Ввод:

2 3 0 0 2 1 0 0 0 0 0 0

Вывод:

3

Пример без стен для понимания структуры входных данных

Пример 2

Ввод:

3 3 0 0 2 0 0 1 0 0 1 0 0 0 0

Вывод:

6

Придётся обойти стену

Пример 3

Ввод:

3 3 0 0 2 0 0 1 0 0 1 0 0 1 0

Вывод:

0

А здесь обойти не получится, выход недостижим

Пример решения:

 N = int(input())
M = int(input())
x1 = int(input())
y1 = int(input())

Вычисляем координаты выхода

x2 = x1 + N - 1 y2 = y1 + M - 1

Создаем двумерный массив для хранения информации о проходах и стенах

map = [[0] * M for i in range(N)]

Заполняем карту проходами и стенами

for i in range(M): for j in range(N): if (i == 0 or j == 0) and (i == N - 2 or j == M - 2): map[i][j] = 0 # выход elif i == x1 and j == y1: map[x1][y1] = 1 # пробуждение else: if map[i-1][j] == 1 or map[i+1][j] == 1: map[i][j] = map[i][j-1] + 1 if j < 0: map[i][j] += map[i][M-1] elif map[i][j+1] == 1: map[i][j] = map[i-1][j] + 1 else: print("No path found!") exit(0) print(map)

Пишет:

StdErr: Traceback (most recent call last): File "script.py", line 1, in <module> N = int(input()) ValueError: invalid literal for int() with base 10: '2 3'

Status: Runtime Error (NZEC)

Статус: Ошибка во время выполнения.

Помогите решить пожалуйста. Чтобы не писал пишет не правильно. Подскажите.

  • 1
    Какое условие задачи соответствует оператору x2 = x1 + N - 1 ? – Stanislav Volodarskiy Sep 01 '23 at 22:26
  • Исправить этот код нельзя. Он не вводит данные задачи и не решает задачу. Некоторые места отдают безумием: if j < 0:. Как j может оказаться меньше нуля? Это шутка? – Stanislav Volodarskiy Sep 01 '23 at 22:31
  • Вы тоже не можете решить? Я вообще не понял как решить. Помогите, кто знает. Странно я писал с вводом, может модератор подшутил? – Professional Developer Sep 01 '23 at 22:45
  • Я думаю, что я могу решить. Обыкновенный поиск в ширину на графе. Ваш код ни мало не напоминает работающее решение. И модератор тут не причем. – Stanislav Volodarskiy Sep 01 '23 at 23:20

1 Answers1

1

Молодец, что решаешь задачи на python. У тебя ошибка возникает при попытке преобразовать строку "2 3" в целое число. Правильным будет использовать функцию input() для получения входных данных, а затем разделить строку на числа с помощью метода split(). Так же у тебя ошибка в вложенном цикле for и отступах. Необходимо исправить их.

Вот так должен был выглядеть твой код:

 N, M = map(int, input().split())
x1, y1 = map(int, input().split())
x2, y2 = map(int, input().split())

Создаем двумерный массив для хранения информации о проходах и стенах

maze = [] for _ in range(N): row = list(map(int, input().split())) maze.append(row)

Проверяем, что точка выхода не является стеной

if maze[x2][y2] != 0: print(0) exit()

Создаем очередь для обхода

queue = [(x1, y1, 0)] # Каждый элемент очереди - это кортеж (x, y, длина пути)

Проверяем все соседние ячейки, пока очередь не станет пустой

while queue: x, y, length = queue.pop(0)

# Проверяем, достигли ли мы точки выхода
if x == x2 and y == y2:
    print(length)
    exit()

# Проверяем каждую из четырех соседних ячеек
for dx, dy in [(0, 1), (0, -1), (1, 0), (-1, 0)]:
    new_x = x + dx
    new_y = y + dy

    # Проверяем, что новые координаты находятся в пределах лабиринта
    if 0 &lt;= new_x &lt; N and 0 &lt;= new_y &lt; M:
        # Проверяем, что новая ячейка является проходом и еще не посещалась
        if maze[new_x][new_y] == 0:
            # Обновляем лабиринт, чтобы отметить, что данная ячейка уже посещена
            maze[new_x][new_y] = 1
            # Добавляем новую ячейку в очередь с увеличенной длиной пути
            queue.append((new_x, new_y, length + 1))

Если не было найдено пути, выводим 0

print(0)

Nymos
  • 565