advent-of-code-2024/python/10.py

54 lines
1.4 KiB
Python
Raw Normal View History

2024-12-10 09:02:55 +01:00
import networkx as nx
# load file contents from ../res/10/input
with open("../res/10/input") as f:
lines = [[int(c) for c in line.strip()] for line in f]
# create a directed graph
G = nx.DiGraph()
starts = []
ends = []
for i, line in enumerate(lines):
for j, c in enumerate(line):
G.add_node((i, j), pos=(i, j))
# add all edges to the graph
for i, line in enumerate(lines):
for j, c in enumerate(line):
if i > 0 and lines[i-1][j] == c+1:
G.add_edge((i, j), (i-1, j), weight=c)
if j > 0 and lines[i][j-1] == c+1:
G.add_edge((i, j), (i, j-1), weight=c)
if i < len(lines)-1 and lines[i+1][j] == c+1:
G.add_edge((i, j), (i+1, j), weight=c)
if j < len(line)-1 and lines[i][j+1] == c+1:
G.add_edge((i, j), (i, j+1), weight=c)
if c == 0:
starts.append((i, j))
if c == 9:
ends.append((i, j))
#pos = nx.get_node_attributes(G, 'pos')
#nx.draw(G, pos, with_labels=True, node_color='lightblue', node_size=500, font_size=16)
#plt.show()
# check if ends are reachable for starts
result = 0
for start in starts:
for end in ends:
if nx.has_path(G, start, end):
result += 1
print("Result 1:",result)
result = 0
for start in starts:
for end in ends:
result += len(list(nx.all_simple_paths(G, start, end)))
print("Result 2:",result)