advent24-llm / day16 /solution_gemini-1.5-pro.py
jerpint's picture
Add solution files
a4da721
raw
history blame
2.18 kB
import heapq
def solve():
file = "input.txt"
grid = []
with open(file, 'r') as f:
for line in f:
grid.append(line.strip())
rows = len(grid)
cols = len(grid[0])
start = None
end = None
for r in range(rows):
for c in range(cols):
if grid[r][c] == 'S':
start = (r, c)
elif grid[r][c] == 'E':
end = (r, c)
directions = [(0, 1), (1, 0), (0, -1), (-1, 0)] # E, S, W, N
def is_valid(r, c):
return 0 <= r < rows and 0 <= c < cols and grid[r][c] != '#'
def dijkstra(start_r, start_c, part2=False):
q = [(0, start_r, start_c, 0)] # (cost, row, col, direction)
visited = set()
min_cost = float('inf')
best_paths = set()
while q:
cost, r, c, d = heapq.heappop(q)
if (r, c, d) in visited:
continue
visited.add((r, c, d))
if (r, c) == end:
if part2:
if cost == min_cost:
best_paths.add((r,c))
elif cost < min_cost:
min_cost = cost
best_paths = set([(r,c)])
else:
return cost
continue
if part2 and cost > min_cost:
continue
# Move forward
nr, nc = r + directions[d][0], c + directions[d][1]
if is_valid(nr, nc):
heapq.heappush(q, (cost + 1, nr, nc, d))
if part2 and cost+1 <= min_cost:
best_paths.add((nr, nc))
# Rotate
for nd in [(d + 1) % 4, (d - 1 + 4) % 4]: # Clockwise and counterclockwise
heapq.heappush(q, (cost + 1000, r, c, nd))
if part2 and cost + 1000 <= min_cost:
best_paths.add((r,c))
if part2:
best_paths.add(start)
return len(best_paths)
return float('inf')
result1 = dijkstra(start[0], start[1])
print(result1)
result2 = dijkstra(start[0], start[1], part2=True)
print(result2)
solve()