rows, cols = len(grid), len(grid[0])
visited = set()
def is_valid_move(row, col):
return 0 <= row < rows and 0 <= col < cols and grid[row][col] == 1
def backtrack(row, col, path):
if all(node in visited for node in nodes_to_visit):
if (row, col) == end_node:
return path + [end_node]
return None
visited.add((row, col))
shortest = None
for dr, dc in [(0, 1), (1, 0), (0, -1), (-1, 0)]:
new_row, new_col = row + dr, col + dc
if is_valid_move(new_row, new_col) and (new_row, new_col) not in visited:
new_path = backtrack(new_row, new_col, path + [(row, col)])
if new_path:
if shortest is None or len(new_path) < len(shortest):
shortest = new_path
visited.remove((row, col))
return shortest
return backtrack(start_node[0], start_node[1], [])
# Example usage:
grid = [
[1, 1, 0, 1, 1, 1],
[1, 1, 1, 1, 0, 1],
[1, 1, 0, 1, 1, 1],
[1, 1, 1, 1, 1, 1]
]
start_node = (0, 0)
end_node = (1, 0)
nodes_to_visit = {(1, 1), (2, 4)}
path = shortest_path(grid, start_node, end_node, nodes_to_visit)
if path:
print("Shortest path:")
for node in path:
print(node)
else:
print("No path found.") ```