Robot Navigation
A robot needs move from top left corner to bottom right corner in a 2D map. In this map, there are 0s and 1s. 0 means the robot can pass and 1 means the wall.
Please write a function that returns True or False, given at most k number of walls to demolish.
Note: The robots can only move up, down, left, right.
Example 1:
Input: grid = [[0, 1 0], [0, 1, 0]], k = 0 Output: False Explanation: The robot cannot demolish any wall due to k == 0, the robot cannot reach the bottom right corner.
Example 2:
Input: grid = [[0, 1 0], [0, 1, 0]], k = 1 Output: True Explanation: The robot can demolish the wall (0, 1) or (1, 1) to reach the destination.
Example 3:
input: grid = [[0, 1, 0, 0, 0], [0, 1, 0 ,1, 0], [0, 1, 0, 1, 0], [0, 1, 0, 1, 0], [0, 0, 0, 1, 0]], k = 0 Output: True Explanation: The robot can first go down and then go up and then go down to reach the destination.
The function interface should be:
def robot_navigation(grid: list[list[int]], k:int)->bool
To solve the problem of navigating a robot through a 2D grid while allowing for the demolition of a limited number of walls, we can use a breadth-first search (BFS) approach. This method will explore all possible paths the robot can take, keeping track of the number of walls it has demolished.
Here's how we can implement the robot_navigation
function:
Initialization: We will use a queue to perform BFS. Each entry in the queue will store the current position of the robot, the number of walls demolished so far, and the remaining walls that can be demolished.
Visited Tracking: We will maintain a 3D list to track visited states, where the dimensions are the grid dimensions and the number of walls demolished. This will help us avoid revisiting the same state.
BFS Exploration: For each position, we will check the four possible directions (up, down, left, right). If the next position is within bounds:
0
, we can move there without demolishing a wall.1
, we can only move there if we have walls left to demolish.Termination: If we reach the bottom-right corner of the grid, we return True
. If the queue is exhausted without reaching the destination, we return False
.
Here is the implementation of the above logic:
from collections import deque
def robot_navigation(grid: list[list[int]], k: int) -> bool:
if not grid or not grid[0]:
return False
rows, cols = len(grid), len(grid[0])
if grid[0][0] == 1 and k == 0:
return False # Can't start if the starting point is a wall and k is 0
if grid[rows - 1][cols - 1] == 1 and k == 0:
return False # Can't finish if the ending point is a wall and k is 0
# Directions for moving up, down, left, right
directions = [(0, 1), (1, 0), (0, -1), (-1, 0)]
# Queue for BFS: (row, col, walls_demolished)
queue = deque([(0, 0, 0)])
# Visited array to keep track of visited states
visited = [[[False] * (k + 1) for _ in range(cols)] for _ in range(rows)]
visited[0][0][0] = True
while queue:
r, c, walls_demolished = queue.popleft()
# Check if we reached the bottom-right corner
if r == rows - 1 and c == cols - 1:
return True
for dr, dc in directions:
nr, nc = r + dr, c + dc
if 0 <= nr < rows and 0 <= nc < cols:
if grid[nr][nc] == 0 and not visited[nr][nc][walls_demolished]:
visited[nr][nc][walls_demolished] = True
queue.append((nr, nc, walls_demolished))
elif grid[nr][nc] == 1 and walls_demolished < k and not visited[nr][nc][walls_demolished + 1]:
visited[nr][nc][walls_demolished + 1] = True
queue.append((nr, nc, walls_demolished + 1))
return False
(0, 0)
and 0
walls demolished.visited
to track whether a cell has been visited with a specific number of walls demolished.True
. If we exhaust all possibilities without reaching it, we return False
.This approach ensures that we efficiently explore all possible paths while respecting the constraints of wall demolitions.