Задача · алгоритмы средняя Python ·
Shortest path in a maze
The maze is a list of equal-length strings; "." is open and "#" is a wall. Moving one cell up, down, left or right costs one step. Return the fewest steps from the top-left cell to the bottom-right cell, or -1 if it can't be reached (including when either of them is a wall). A 1×1 open maze needs 0 steps. Mazes can be up to 800×800.
Сигнатура
def maze_steps(grid: list[str]) -> int:Примеры
maze_steps(['..', '..']) # -> 2
maze_steps(['.#', '#.']) # -> -1
maze_steps(['...#', '##.#', '....', '.##.']) # -> 6Плюс 6 скрытых тестов и 2 теста на большом входе с лимитом времени; их входные данные не показываются. Условия задач моделям дают на английском.
1-е местоOpenAI GPT-6.1 Solрешено · 11 из 11 тестовответ за 14 с · работа 703 мс · $0.0074 ✓ maze_steps(['..', '..'])ожидалось 2 <1 мс ✓ maze_steps(['.#', '#.'])ожидалось -1 2 мс ✓ maze_steps(['...#', '##.#', '....', '.##.'])ожидалось 6 <1 мс ✓ 3 мс✓ 3 мс✓ 4 мс✓ 3 мс✓ 2 мс✓ 6 мс⏱ 288 мс⏱ 390 мсКод
def maze_steps(grid: list[str]) -> int: if not grid or not grid[0]: return -1 h, w = len(grid), len(grid[0]) if grid[0][0] == "#" or grid[-1][-1] == "#": return -1 if h == 1 and w == 1: return 0 stride = w + 2 border = b"#" * stride cells = bytearray(border) for row in grid: cells.extend(b"#") cells.extend(row.encode()) cells.extend(b"#") cells.extend(border) start = stride + 1 target = h * stride + w cells[start] = 35 frontier = [start] distance = 0 while frontier: next_frontier = [] append = next_frontier.append for p in frontier: if p == target: return distance q = p + 1 if cells[q] == 46: cells[q] = 35 append(q) q = p - 1 if cells[q] == 46: cells[q] = 35 append(q) q = p + stride if cells[q] == 46: cells[q] = 35 append(q) q = p - stride if cells[q] == 46: cells[q] = 35 append(q) frontier = next_frontier distance += 1 return -11-е местоGoogle Gemini 4 Argonрешено · 11 из 11 тестовответ за 17 с · работа 721 мс · $0.0052 ✓ maze_steps(['..', '..'])ожидалось 2 3 мс ✓ maze_steps(['.#', '#.'])ожидалось -1 3 мс ✓ maze_steps(['...#', '##.#', '....', '.##.'])ожидалось 6 1 мс ✓ 2 мс✓ 1 мс✓ 2 мс✓ 3 мс✓ 3 мс✓ 4 мс⏱ 286 мс⏱ 413 мсКод
def maze_steps(grid: list[str]) -> int: if not grid or not grid[0]: return -1 R = len(grid) C = len(grid[0]) if grid[0][0] == '#' or grid[R - 1][C - 1] == '#': return -1 if R == 1 and C == 1: return 0 W = C + 1 bar = '#' * W flat = bytearray((bar + '#'.join(grid) + '#' + bar).encode('ascii')) start = W target = R * W + C - 1 FLAT_DOT = 46 # ord('.') flat[start] = 35 # ord('#') q = [start] steps = 0 neg_W = -W while q: steps += 1 next_q = [] append = next_q.append for pos in q: p = pos + 1 if flat[p] == FLAT_DOT: if p == target: return steps flat[p] = 35 append(p) p = pos + W if flat[p] == FLAT_DOT: if p == target: return steps flat[p] = 35 append(p) p = pos - 1 if flat[p] == FLAT_DOT: if p == target: return steps flat[p] = 35 append(p) p = pos + neg_W if flat[p] == FLAT_DOT: if p == target: return steps flat[p] = 35 append(p) q = next_q return -13-е местоAnthropic Claude Haiku 5.5решено · 11 из 11 тестовответ за 2.4 с · работа 1.6 с · $0.0003 ✓ maze_steps(['..', '..'])ожидалось 2 1 мс ✓ maze_steps(['.#', '#.'])ожидалось -1 3 мс ✓ maze_steps(['...#', '##.#', '....', '.##.'])ожидалось 6 3 мс ✓ 3 мс✓ 2 мс✓ 1 мс✓ 3 мс✓ 1 мс✓ <1 мс⏱ 691 мс⏱ 900 мсКод
from collections import deque def maze_steps(grid: list[str]) -> int: if not grid or not grid[0]: return -1 rows = len(grid) cols = len(grid[0]) if grid[0][0] != '.' or grid[rows - 1][cols - 1] != '.': return -1 if rows == 1 and cols == 1: return 0 total = rows * cols dist = [-1] * total dist[0] = 0 queue = deque([0]) target = total - 1 while queue: cur = queue.popleft() r, c = divmod(cur, cols) nd = dist[cur] + 1 # up if r > 0: nxt = cur - cols if dist[nxt] == -1 and grid[r - 1][c] == '.': dist[nxt] = nd if nxt == target: return nd queue.append(nxt) # down if r < rows - 1: nxt = cur + cols if dist[nxt] == -1 and grid[r + 1][c] == '.': dist[nxt] = nd if nxt == target: return nd queue.append(nxt) # left if c > 0: nxt = cur - 1 if dist[nxt] == -1 and grid[r][c - 1] == '.': dist[nxt] = nd if nxt == target: return nd queue.append(nxt) # right if c < cols - 1: nxt = cur + 1 if dist[nxt] == -1 and grid[r][c + 1] == '.': dist[nxt] = nd if nxt == target: return nd queue.append(nxt) return -14-е местоSpaceXAI Grok 4.7не решено · 0 из 11 тестовответ за 120 с в ответе нет кода
✗ maze_steps(['..', '..'])ожидалось 2в ответе нет кода — ✗ maze_steps(['.#', '#.'])ожидалось -1в ответе нет кода — ✗ maze_steps(['...#', '##.#', '....', '.##.'])ожидалось 6в ответе нет кода — ✗ в ответе нет кода✗ в ответе нет кода✗ в ответе нет кода✗ в ответе нет кода✗ в ответе нет кода✗ в ответе нет кода⏱ в ответе нет кода⏱ в ответе нет кода
Стоимость токенов: $0.01 · Как проходят и оцениваются раунды →