Add 16 Part 2 and move heapq testcode
This commit is contained in:
1 parent
8e422c38c6
commit
cbac2f70a2
2 files changed
+190
-860
No files matched your search
+59
-860
@@ -2,761 +2,9 @@
|
|||||||
"cells": [
|
"cells": [
|
||||||
{
|
{
|
||||||
"cell_type": "code",
|
"cell_type": "code",
|
||||||
"execution_count": 10,
|
"execution_count": 72,
|
||||||
"metadata": {},
|
"metadata": {},
|
||||||
"outputs": [
|
"outputs": [],
|
||||||
{
|
|
||||||
"data": {
|
|
||||||
"text/plain": [
|
|
||||||
"([(1, 13),\n",
|
|
||||||
" (1, 12),\n",
|
|
||||||
" (1, 11),\n",
|
|
||||||
" (2, 11),\n",
|
|
||||||
" (3, 11),\n",
|
|
||||||
" (4, 11),\n",
|
|
||||||
" (5, 11),\n",
|
|
||||||
" (5, 10),\n",
|
|
||||||
" (5, 9),\n",
|
|
||||||
" (5, 8),\n",
|
|
||||||
" (5, 7),\n",
|
|
||||||
" (6, 7),\n",
|
|
||||||
" (7, 7),\n",
|
|
||||||
" (8, 7),\n",
|
|
||||||
" (9, 7),\n",
|
|
||||||
" (9, 6),\n",
|
|
||||||
" (9, 5),\n",
|
|
||||||
" (10, 5),\n",
|
|
||||||
" (11, 5),\n",
|
|
||||||
" (11, 4),\n",
|
|
||||||
" (11, 3),\n",
|
|
||||||
" (10, 3),\n",
|
|
||||||
" (9, 3),\n",
|
|
||||||
" (9, 2),\n",
|
|
||||||
" (9, 1),\n",
|
|
||||||
" (10, 1),\n",
|
|
||||||
" (11, 1),\n",
|
|
||||||
" (12, 1),\n",
|
|
||||||
" (13, 1)],\n",
|
|
||||||
" 28)"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"execution_count": 10,
|
|
||||||
"metadata": {},
|
|
||||||
"output_type": "execute_result"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"source": [
|
|
||||||
"# Rechecking the imports and retrying the execution\n",
|
|
||||||
"\n",
|
|
||||||
"# Importing NetworkX again to ensure proper initialization\n",
|
|
||||||
"import networkx as nx\n",
|
|
||||||
"\n",
|
|
||||||
"# Retry defining and executing the code\n",
|
|
||||||
"with open('testinput','r') as infile:\n",
|
|
||||||
" ascii_map = infile.read()\n",
|
|
||||||
"\n",
|
|
||||||
"def parse_ascii_map(ascii_map):\n",
|
|
||||||
" graph = nx.DiGraph() # Directed graph for flexibility with edge weights\n",
|
|
||||||
" rows = ascii_map.strip().split(\"\\n\")\n",
|
|
||||||
" height, width = len(rows), len(rows[0])\n",
|
|
||||||
" directions = [(-1, 0), (1, 0), (0, -1), (0, 1)] # Up, Down, Left, Right\n",
|
|
||||||
"\n",
|
|
||||||
" start, end = None, None\n",
|
|
||||||
" for y, row in enumerate(rows):\n",
|
|
||||||
" for x, char in enumerate(row):\n",
|
|
||||||
" if char != '#': # Not a wall\n",
|
|
||||||
" graph.add_node((x, y))\n",
|
|
||||||
" if char == 'S':\n",
|
|
||||||
" start = (x, y)\n",
|
|
||||||
" elif char == 'E':\n",
|
|
||||||
" end = (x, y)\n",
|
|
||||||
"\n",
|
|
||||||
" # Add edges for neighbors\n",
|
|
||||||
" for dx, dy in directions:\n",
|
|
||||||
" nx_new, ny_new = x + dx, y + dy\n",
|
|
||||||
" if 0 <= nx_new < width and 0 <= ny_new < height and rows[ny_new][nx_new] != '#':\n",
|
|
||||||
" graph.add_edge((x, y), (nx_new, ny_new), weight=1)\n",
|
|
||||||
" return graph, start, end\n",
|
|
||||||
"\n",
|
|
||||||
"def find_shortest_path(graph, start, end):\n",
|
|
||||||
" try:\n",
|
|
||||||
" path = nx.shortest_path(graph, source=start, target=end, weight='weight')\n",
|
|
||||||
" cost = nx.shortest_path_length(graph, source=start, target=end, weight='weight')\n",
|
|
||||||
" return path, cost\n",
|
|
||||||
" except nx.NetworkXNoPath:\n",
|
|
||||||
" return None, float('inf')\n",
|
|
||||||
"\n",
|
|
||||||
"# Parse and solve\n",
|
|
||||||
"graph, start, end = parse_ascii_map(ascii_map)\n",
|
|
||||||
"path, cost = find_shortest_path(graph, start, end)\n",
|
|
||||||
"\n",
|
|
||||||
"path, cost\n"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"cell_type": "code",
|
|
||||||
"execution_count": 12,
|
|
||||||
"metadata": {},
|
|
||||||
"outputs": [
|
|
||||||
{
|
|
||||||
"data": {
|
|
||||||
"text/plain": [
|
|
||||||
"([(1, 139, 'E'),\n",
|
|
||||||
" (2, 139, 'E'),\n",
|
|
||||||
" (3, 139, 'E'),\n",
|
|
||||||
" (3, 139, 'N'),\n",
|
|
||||||
" (3, 138, 'N'),\n",
|
|
||||||
" (3, 137, 'N'),\n",
|
|
||||||
" (3, 137, 'E'),\n",
|
|
||||||
" (4, 137, 'E'),\n",
|
|
||||||
" (5, 137, 'E'),\n",
|
|
||||||
" (5, 137, 'S'),\n",
|
|
||||||
" (5, 138, 'S'),\n",
|
|
||||||
" (5, 139, 'S'),\n",
|
|
||||||
" (5, 139, 'E'),\n",
|
|
||||||
" (6, 139, 'E'),\n",
|
|
||||||
" (7, 139, 'E'),\n",
|
|
||||||
" (7, 139, 'N'),\n",
|
|
||||||
" (7, 138, 'N'),\n",
|
|
||||||
" (7, 137, 'N'),\n",
|
|
||||||
" (7, 137, 'E'),\n",
|
|
||||||
" (8, 137, 'E'),\n",
|
|
||||||
" (9, 137, 'E'),\n",
|
|
||||||
" (10, 137, 'E'),\n",
|
|
||||||
" (11, 137, 'E'),\n",
|
|
||||||
" (11, 137, 'S'),\n",
|
|
||||||
" (11, 138, 'S'),\n",
|
|
||||||
" (11, 139, 'S'),\n",
|
|
||||||
" (11, 139, 'E'),\n",
|
|
||||||
" (12, 139, 'E'),\n",
|
|
||||||
" (13, 139, 'E'),\n",
|
|
||||||
" (13, 139, 'N'),\n",
|
|
||||||
" (13, 138, 'N'),\n",
|
|
||||||
" (13, 137, 'N'),\n",
|
|
||||||
" (13, 137, 'E'),\n",
|
|
||||||
" (14, 137, 'E'),\n",
|
|
||||||
" (15, 137, 'E'),\n",
|
|
||||||
" (15, 137, 'S'),\n",
|
|
||||||
" (15, 138, 'S'),\n",
|
|
||||||
" (15, 139, 'S'),\n",
|
|
||||||
" (15, 139, 'E'),\n",
|
|
||||||
" (16, 139, 'E'),\n",
|
|
||||||
" (17, 139, 'E'),\n",
|
|
||||||
" (17, 139, 'N'),\n",
|
|
||||||
" (17, 138, 'N'),\n",
|
|
||||||
" (17, 137, 'N'),\n",
|
|
||||||
" (17, 136, 'N'),\n",
|
|
||||||
" (17, 135, 'N'),\n",
|
|
||||||
" (17, 134, 'N'),\n",
|
|
||||||
" (17, 133, 'N'),\n",
|
|
||||||
" (17, 133, 'E'),\n",
|
|
||||||
" (18, 133, 'E'),\n",
|
|
||||||
" (19, 133, 'E'),\n",
|
|
||||||
" (20, 133, 'E'),\n",
|
|
||||||
" (21, 133, 'E'),\n",
|
|
||||||
" (22, 133, 'E'),\n",
|
|
||||||
" (23, 133, 'E'),\n",
|
|
||||||
" (24, 133, 'E'),\n",
|
|
||||||
" (25, 133, 'E'),\n",
|
|
||||||
" (26, 133, 'E'),\n",
|
|
||||||
" (27, 133, 'E'),\n",
|
|
||||||
" (28, 133, 'E'),\n",
|
|
||||||
" (29, 133, 'E'),\n",
|
|
||||||
" (30, 133, 'E'),\n",
|
|
||||||
" (31, 133, 'E'),\n",
|
|
||||||
" (32, 133, 'E'),\n",
|
|
||||||
" (33, 133, 'E'),\n",
|
|
||||||
" (34, 133, 'E'),\n",
|
|
||||||
" (35, 133, 'E'),\n",
|
|
||||||
" (35, 133, 'S'),\n",
|
|
||||||
" (35, 134, 'S'),\n",
|
|
||||||
" (35, 135, 'S'),\n",
|
|
||||||
" (35, 136, 'S'),\n",
|
|
||||||
" (35, 137, 'S'),\n",
|
|
||||||
" (35, 138, 'S'),\n",
|
|
||||||
" (35, 139, 'S'),\n",
|
|
||||||
" (35, 139, 'E'),\n",
|
|
||||||
" (36, 139, 'E'),\n",
|
|
||||||
" (37, 139, 'E'),\n",
|
|
||||||
" (37, 139, 'N'),\n",
|
|
||||||
" (37, 138, 'N'),\n",
|
|
||||||
" (37, 137, 'N'),\n",
|
|
||||||
" (37, 137, 'E'),\n",
|
|
||||||
" (38, 137, 'E'),\n",
|
|
||||||
" (39, 137, 'E'),\n",
|
|
||||||
" (39, 137, 'N'),\n",
|
|
||||||
" (39, 136, 'N'),\n",
|
|
||||||
" (39, 135, 'N'),\n",
|
|
||||||
" (39, 134, 'N'),\n",
|
|
||||||
" (39, 133, 'N'),\n",
|
|
||||||
" (39, 133, 'E'),\n",
|
|
||||||
" (40, 133, 'E'),\n",
|
|
||||||
" (41, 133, 'E'),\n",
|
|
||||||
" (41, 133, 'S'),\n",
|
|
||||||
" (41, 134, 'S'),\n",
|
|
||||||
" (41, 135, 'S'),\n",
|
|
||||||
" (41, 136, 'S'),\n",
|
|
||||||
" (41, 137, 'S'),\n",
|
|
||||||
" (41, 138, 'S'),\n",
|
|
||||||
" (41, 139, 'S'),\n",
|
|
||||||
" (41, 139, 'E'),\n",
|
|
||||||
" (42, 139, 'E'),\n",
|
|
||||||
" (43, 139, 'E'),\n",
|
|
||||||
" (44, 139, 'E'),\n",
|
|
||||||
" (45, 139, 'E'),\n",
|
|
||||||
" (45, 139, 'N'),\n",
|
|
||||||
" (45, 138, 'N'),\n",
|
|
||||||
" (45, 137, 'N'),\n",
|
|
||||||
" (45, 137, 'E'),\n",
|
|
||||||
" (46, 137, 'E'),\n",
|
|
||||||
" (47, 137, 'E'),\n",
|
|
||||||
" (48, 137, 'E'),\n",
|
|
||||||
" (49, 137, 'E'),\n",
|
|
||||||
" (49, 137, 'N'),\n",
|
|
||||||
" (49, 136, 'N'),\n",
|
|
||||||
" (49, 135, 'N'),\n",
|
|
||||||
" (49, 134, 'N'),\n",
|
|
||||||
" (49, 133, 'N'),\n",
|
|
||||||
" (49, 133, 'E'),\n",
|
|
||||||
" (50, 133, 'E'),\n",
|
|
||||||
" (51, 133, 'E'),\n",
|
|
||||||
" (52, 133, 'E'),\n",
|
|
||||||
" (53, 133, 'E'),\n",
|
|
||||||
" (53, 133, 'S'),\n",
|
|
||||||
" (53, 134, 'S'),\n",
|
|
||||||
" (53, 135, 'S'),\n",
|
|
||||||
" (53, 136, 'S'),\n",
|
|
||||||
" (53, 137, 'S'),\n",
|
|
||||||
" (53, 138, 'S'),\n",
|
|
||||||
" (53, 139, 'S'),\n",
|
|
||||||
" (53, 139, 'E'),\n",
|
|
||||||
" (54, 139, 'E'),\n",
|
|
||||||
" (55, 139, 'E'),\n",
|
|
||||||
" (56, 139, 'E'),\n",
|
|
||||||
" (57, 139, 'E'),\n",
|
|
||||||
" (57, 139, 'N'),\n",
|
|
||||||
" (57, 138, 'N'),\n",
|
|
||||||
" (57, 137, 'N'),\n",
|
|
||||||
" (57, 136, 'N'),\n",
|
|
||||||
" (57, 135, 'N'),\n",
|
|
||||||
" (57, 135, 'E'),\n",
|
|
||||||
" (58, 135, 'E'),\n",
|
|
||||||
" (59, 135, 'E'),\n",
|
|
||||||
" (60, 135, 'E'),\n",
|
|
||||||
" (61, 135, 'E'),\n",
|
|
||||||
" (61, 135, 'S'),\n",
|
|
||||||
" (61, 136, 'S'),\n",
|
|
||||||
" (61, 137, 'S'),\n",
|
|
||||||
" (61, 137, 'W'),\n",
|
|
||||||
" (60, 137, 'W'),\n",
|
|
||||||
" (59, 137, 'W'),\n",
|
|
||||||
" (59, 137, 'S'),\n",
|
|
||||||
" (59, 138, 'S'),\n",
|
|
||||||
" (59, 139, 'S'),\n",
|
|
||||||
" (59, 139, 'E'),\n",
|
|
||||||
" (60, 139, 'E'),\n",
|
|
||||||
" (61, 139, 'E'),\n",
|
|
||||||
" (62, 139, 'E'),\n",
|
|
||||||
" (63, 139, 'E'),\n",
|
|
||||||
" (64, 139, 'E'),\n",
|
|
||||||
" (65, 139, 'E'),\n",
|
|
||||||
" (66, 139, 'E'),\n",
|
|
||||||
" (67, 139, 'E'),\n",
|
|
||||||
" (68, 139, 'E'),\n",
|
|
||||||
" (69, 139, 'E'),\n",
|
|
||||||
" (69, 139, 'N'),\n",
|
|
||||||
" (69, 138, 'N'),\n",
|
|
||||||
" (69, 137, 'N'),\n",
|
|
||||||
" (69, 137, 'E'),\n",
|
|
||||||
" (70, 137, 'E'),\n",
|
|
||||||
" (71, 137, 'E'),\n",
|
|
||||||
" (72, 137, 'E'),\n",
|
|
||||||
" (73, 137, 'E'),\n",
|
|
||||||
" (74, 137, 'E'),\n",
|
|
||||||
" (75, 137, 'E'),\n",
|
|
||||||
" (76, 137, 'E'),\n",
|
|
||||||
" (77, 137, 'E'),\n",
|
|
||||||
" (78, 137, 'E'),\n",
|
|
||||||
" (79, 137, 'E'),\n",
|
|
||||||
" (79, 137, 'S'),\n",
|
|
||||||
" (79, 138, 'S'),\n",
|
|
||||||
" (79, 139, 'S'),\n",
|
|
||||||
" (79, 139, 'E'),\n",
|
|
||||||
" (80, 139, 'E'),\n",
|
|
||||||
" (81, 139, 'E'),\n",
|
|
||||||
" (82, 139, 'E'),\n",
|
|
||||||
" (83, 139, 'E'),\n",
|
|
||||||
" (84, 139, 'E'),\n",
|
|
||||||
" (85, 139, 'E'),\n",
|
|
||||||
" (86, 139, 'E'),\n",
|
|
||||||
" (87, 139, 'E'),\n",
|
|
||||||
" (88, 139, 'E'),\n",
|
|
||||||
" (89, 139, 'E'),\n",
|
|
||||||
" (90, 139, 'E'),\n",
|
|
||||||
" (91, 139, 'E'),\n",
|
|
||||||
" (92, 139, 'E'),\n",
|
|
||||||
" (93, 139, 'E'),\n",
|
|
||||||
" (94, 139, 'E'),\n",
|
|
||||||
" (95, 139, 'E'),\n",
|
|
||||||
" (96, 139, 'E'),\n",
|
|
||||||
" (97, 139, 'E'),\n",
|
|
||||||
" (98, 139, 'E'),\n",
|
|
||||||
" (99, 139, 'E'),\n",
|
|
||||||
" (100, 139, 'E'),\n",
|
|
||||||
" (101, 139, 'E'),\n",
|
|
||||||
" (102, 139, 'E'),\n",
|
|
||||||
" (103, 139, 'E'),\n",
|
|
||||||
" (104, 139, 'E'),\n",
|
|
||||||
" (105, 139, 'E'),\n",
|
|
||||||
" (106, 139, 'E'),\n",
|
|
||||||
" (107, 139, 'E'),\n",
|
|
||||||
" (108, 139, 'E'),\n",
|
|
||||||
" (109, 139, 'E'),\n",
|
|
||||||
" (110, 139, 'E'),\n",
|
|
||||||
" (111, 139, 'E'),\n",
|
|
||||||
" (112, 139, 'E'),\n",
|
|
||||||
" (113, 139, 'E'),\n",
|
|
||||||
" (113, 139, 'N'),\n",
|
|
||||||
" (113, 138, 'N'),\n",
|
|
||||||
" (113, 137, 'N'),\n",
|
|
||||||
" (113, 136, 'N'),\n",
|
|
||||||
" (113, 135, 'N'),\n",
|
|
||||||
" (113, 134, 'N'),\n",
|
|
||||||
" (113, 133, 'N'),\n",
|
|
||||||
" (113, 132, 'N'),\n",
|
|
||||||
" (113, 131, 'N'),\n",
|
|
||||||
" (113, 130, 'N'),\n",
|
|
||||||
" (113, 129, 'N'),\n",
|
|
||||||
" (113, 128, 'N'),\n",
|
|
||||||
" (113, 127, 'N'),\n",
|
|
||||||
" (113, 126, 'N'),\n",
|
|
||||||
" (113, 125, 'N'),\n",
|
|
||||||
" (113, 124, 'N'),\n",
|
|
||||||
" (113, 123, 'N'),\n",
|
|
||||||
" (113, 123, 'E'),\n",
|
|
||||||
" (114, 123, 'E'),\n",
|
|
||||||
" (115, 123, 'E'),\n",
|
|
||||||
" (115, 123, 'N'),\n",
|
|
||||||
" (115, 122, 'N'),\n",
|
|
||||||
" (115, 121, 'N'),\n",
|
|
||||||
" (115, 121, 'E'),\n",
|
|
||||||
" (116, 121, 'E'),\n",
|
|
||||||
" (117, 121, 'E'),\n",
|
|
||||||
" (118, 121, 'E'),\n",
|
|
||||||
" (119, 121, 'E'),\n",
|
|
||||||
" (120, 121, 'E'),\n",
|
|
||||||
" (121, 121, 'E'),\n",
|
|
||||||
" (121, 121, 'N'),\n",
|
|
||||||
" (121, 120, 'N'),\n",
|
|
||||||
" (121, 119, 'N'),\n",
|
|
||||||
" (121, 119, 'E'),\n",
|
|
||||||
" (122, 119, 'E'),\n",
|
|
||||||
" (123, 119, 'E'),\n",
|
|
||||||
" (123, 119, 'N'),\n",
|
|
||||||
" (123, 118, 'N'),\n",
|
|
||||||
" (123, 117, 'N'),\n",
|
|
||||||
" (123, 116, 'N'),\n",
|
|
||||||
" (123, 115, 'N'),\n",
|
|
||||||
" (123, 115, 'W'),\n",
|
|
||||||
" (122, 115, 'W'),\n",
|
|
||||||
" (121, 115, 'W'),\n",
|
|
||||||
" (121, 115, 'N'),\n",
|
|
||||||
" (121, 114, 'N'),\n",
|
|
||||||
" (121, 113, 'N'),\n",
|
|
||||||
" (121, 112, 'N'),\n",
|
|
||||||
" (121, 111, 'N'),\n",
|
|
||||||
" (121, 110, 'N'),\n",
|
|
||||||
" (121, 109, 'N'),\n",
|
|
||||||
" (121, 108, 'N'),\n",
|
|
||||||
" (121, 107, 'N'),\n",
|
|
||||||
" (121, 107, 'W'),\n",
|
|
||||||
" (120, 107, 'W'),\n",
|
|
||||||
" (119, 107, 'W'),\n",
|
|
||||||
" (119, 107, 'N'),\n",
|
|
||||||
" (119, 106, 'N'),\n",
|
|
||||||
" (119, 105, 'N'),\n",
|
|
||||||
" (119, 104, 'N'),\n",
|
|
||||||
" (119, 103, 'N'),\n",
|
|
||||||
" (119, 103, 'W'),\n",
|
|
||||||
" (118, 103, 'W'),\n",
|
|
||||||
" (117, 103, 'W'),\n",
|
|
||||||
" (117, 103, 'S'),\n",
|
|
||||||
" (117, 104, 'S'),\n",
|
|
||||||
" (117, 105, 'S'),\n",
|
|
||||||
" (117, 105, 'W'),\n",
|
|
||||||
" (116, 105, 'W'),\n",
|
|
||||||
" (115, 105, 'W'),\n",
|
|
||||||
" (115, 105, 'N'),\n",
|
|
||||||
" (115, 104, 'N'),\n",
|
|
||||||
" (115, 103, 'N'),\n",
|
|
||||||
" (115, 102, 'N'),\n",
|
|
||||||
" (115, 101, 'N'),\n",
|
|
||||||
" (115, 100, 'N'),\n",
|
|
||||||
" (115, 99, 'N'),\n",
|
|
||||||
" (115, 99, 'W'),\n",
|
|
||||||
" (114, 99, 'W'),\n",
|
|
||||||
" (113, 99, 'W'),\n",
|
|
||||||
" (113, 99, 'N'),\n",
|
|
||||||
" (113, 98, 'N'),\n",
|
|
||||||
" (113, 97, 'N'),\n",
|
|
||||||
" (113, 97, 'W'),\n",
|
|
||||||
" (112, 97, 'W'),\n",
|
|
||||||
" (111, 97, 'W'),\n",
|
|
||||||
" (111, 97, 'N'),\n",
|
|
||||||
" (111, 96, 'N'),\n",
|
|
||||||
" (111, 95, 'N'),\n",
|
|
||||||
" (111, 95, 'E'),\n",
|
|
||||||
" (112, 95, 'E'),\n",
|
|
||||||
" (113, 95, 'E'),\n",
|
|
||||||
" (113, 95, 'N'),\n",
|
|
||||||
" (113, 94, 'N'),\n",
|
|
||||||
" (113, 93, 'N'),\n",
|
|
||||||
" (113, 92, 'N'),\n",
|
|
||||||
" (113, 91, 'N'),\n",
|
|
||||||
" (113, 90, 'N'),\n",
|
|
||||||
" (113, 89, 'N'),\n",
|
|
||||||
" (113, 89, 'E'),\n",
|
|
||||||
" (114, 89, 'E'),\n",
|
|
||||||
" (115, 89, 'E'),\n",
|
|
||||||
" (116, 89, 'E'),\n",
|
|
||||||
" (117, 89, 'E'),\n",
|
|
||||||
" (117, 89, 'S'),\n",
|
|
||||||
" (117, 90, 'S'),\n",
|
|
||||||
" (117, 91, 'S'),\n",
|
|
||||||
" (117, 91, 'E'),\n",
|
|
||||||
" (118, 91, 'E'),\n",
|
|
||||||
" (119, 91, 'E'),\n",
|
|
||||||
" (119, 91, 'N'),\n",
|
|
||||||
" (119, 90, 'N'),\n",
|
|
||||||
" (119, 89, 'N'),\n",
|
|
||||||
" (119, 89, 'E'),\n",
|
|
||||||
" (120, 89, 'E'),\n",
|
|
||||||
" (121, 89, 'E'),\n",
|
|
||||||
" (122, 89, 'E'),\n",
|
|
||||||
" (123, 89, 'E'),\n",
|
|
||||||
" (123, 89, 'N'),\n",
|
|
||||||
" (123, 88, 'N'),\n",
|
|
||||||
" (123, 87, 'N'),\n",
|
|
||||||
" (123, 86, 'N'),\n",
|
|
||||||
" (123, 85, 'N'),\n",
|
|
||||||
" (123, 84, 'N'),\n",
|
|
||||||
" (123, 83, 'N'),\n",
|
|
||||||
" (123, 82, 'N'),\n",
|
|
||||||
" (123, 81, 'N'),\n",
|
|
||||||
" (123, 81, 'E'),\n",
|
|
||||||
" (124, 81, 'E'),\n",
|
|
||||||
" (125, 81, 'E'),\n",
|
|
||||||
" (125, 81, 'S'),\n",
|
|
||||||
" (125, 82, 'S'),\n",
|
|
||||||
" (125, 83, 'S'),\n",
|
|
||||||
" (125, 83, 'E'),\n",
|
|
||||||
" (126, 83, 'E'),\n",
|
|
||||||
" (127, 83, 'E'),\n",
|
|
||||||
" (127, 83, 'N'),\n",
|
|
||||||
" (127, 82, 'N'),\n",
|
|
||||||
" (127, 81, 'N'),\n",
|
|
||||||
" (127, 80, 'N'),\n",
|
|
||||||
" (127, 79, 'N'),\n",
|
|
||||||
" (127, 79, 'E'),\n",
|
|
||||||
" (128, 79, 'E'),\n",
|
|
||||||
" (129, 79, 'E'),\n",
|
|
||||||
" (129, 79, 'N'),\n",
|
|
||||||
" (129, 78, 'N'),\n",
|
|
||||||
" (129, 77, 'N'),\n",
|
|
||||||
" (129, 77, 'W'),\n",
|
|
||||||
" (128, 77, 'W'),\n",
|
|
||||||
" (127, 77, 'W'),\n",
|
|
||||||
" (126, 77, 'W'),\n",
|
|
||||||
" (125, 77, 'W'),\n",
|
|
||||||
" (124, 77, 'W'),\n",
|
|
||||||
" (123, 77, 'W'),\n",
|
|
||||||
" (123, 77, 'S'),\n",
|
|
||||||
" (123, 78, 'S'),\n",
|
|
||||||
" (123, 79, 'S'),\n",
|
|
||||||
" (123, 79, 'W'),\n",
|
|
||||||
" (122, 79, 'W'),\n",
|
|
||||||
" (121, 79, 'W'),\n",
|
|
||||||
" (121, 79, 'N'),\n",
|
|
||||||
" (121, 78, 'N'),\n",
|
|
||||||
" (121, 77, 'N'),\n",
|
|
||||||
" (121, 76, 'N'),\n",
|
|
||||||
" (121, 75, 'N'),\n",
|
|
||||||
" (121, 75, 'E'),\n",
|
|
||||||
" (122, 75, 'E'),\n",
|
|
||||||
" (123, 75, 'E'),\n",
|
|
||||||
" (124, 75, 'E'),\n",
|
|
||||||
" (125, 75, 'E'),\n",
|
|
||||||
" (125, 75, 'N'),\n",
|
|
||||||
" (125, 74, 'N'),\n",
|
|
||||||
" (125, 73, 'N'),\n",
|
|
||||||
" (125, 73, 'W'),\n",
|
|
||||||
" (124, 73, 'W'),\n",
|
|
||||||
" (123, 73, 'W'),\n",
|
|
||||||
" (123, 73, 'N'),\n",
|
|
||||||
" (123, 72, 'N'),\n",
|
|
||||||
" (123, 71, 'N'),\n",
|
|
||||||
" (123, 71, 'E'),\n",
|
|
||||||
" (124, 71, 'E'),\n",
|
|
||||||
" (125, 71, 'E'),\n",
|
|
||||||
" (126, 71, 'E'),\n",
|
|
||||||
" (127, 71, 'E'),\n",
|
|
||||||
" (128, 71, 'E'),\n",
|
|
||||||
" (129, 71, 'E'),\n",
|
|
||||||
" (129, 71, 'N'),\n",
|
|
||||||
" (129, 70, 'N'),\n",
|
|
||||||
" (129, 69, 'N'),\n",
|
|
||||||
" (129, 69, 'E'),\n",
|
|
||||||
" (130, 69, 'E'),\n",
|
|
||||||
" (131, 69, 'E'),\n",
|
|
||||||
" (131, 69, 'S'),\n",
|
|
||||||
" (131, 70, 'S'),\n",
|
|
||||||
" (131, 71, 'S'),\n",
|
|
||||||
" (131, 72, 'S'),\n",
|
|
||||||
" (131, 73, 'S'),\n",
|
|
||||||
" (131, 74, 'S'),\n",
|
|
||||||
" (131, 75, 'S'),\n",
|
|
||||||
" (131, 75, 'E'),\n",
|
|
||||||
" (132, 75, 'E'),\n",
|
|
||||||
" (133, 75, 'E'),\n",
|
|
||||||
" (134, 75, 'E'),\n",
|
|
||||||
" (135, 75, 'E'),\n",
|
|
||||||
" (136, 75, 'E'),\n",
|
|
||||||
" (137, 75, 'E'),\n",
|
|
||||||
" (138, 75, 'E'),\n",
|
|
||||||
" (139, 75, 'E'),\n",
|
|
||||||
" (139, 75, 'N'),\n",
|
|
||||||
" (139, 74, 'N'),\n",
|
|
||||||
" (139, 73, 'N'),\n",
|
|
||||||
" (139, 73, 'W'),\n",
|
|
||||||
" (138, 73, 'W'),\n",
|
|
||||||
" (137, 73, 'W'),\n",
|
|
||||||
" (137, 73, 'N'),\n",
|
|
||||||
" (137, 72, 'N'),\n",
|
|
||||||
" (137, 71, 'N'),\n",
|
|
||||||
" (137, 71, 'W'),\n",
|
|
||||||
" (136, 71, 'W'),\n",
|
|
||||||
" (135, 71, 'W'),\n",
|
|
||||||
" (134, 71, 'W'),\n",
|
|
||||||
" (133, 71, 'W'),\n",
|
|
||||||
" (133, 71, 'N'),\n",
|
|
||||||
" (133, 70, 'N'),\n",
|
|
||||||
" (133, 69, 'N'),\n",
|
|
||||||
" (133, 68, 'N'),\n",
|
|
||||||
" (133, 67, 'N'),\n",
|
|
||||||
" (133, 67, 'W'),\n",
|
|
||||||
" (132, 67, 'W'),\n",
|
|
||||||
" (131, 67, 'W'),\n",
|
|
||||||
" (131, 67, 'N'),\n",
|
|
||||||
" (131, 66, 'N'),\n",
|
|
||||||
" (131, 65, 'N'),\n",
|
|
||||||
" (131, 65, 'E'),\n",
|
|
||||||
" (132, 65, 'E'),\n",
|
|
||||||
" (133, 65, 'E'),\n",
|
|
||||||
" (133, 65, 'N'),\n",
|
|
||||||
" (133, 64, 'N'),\n",
|
|
||||||
" (133, 63, 'N'),\n",
|
|
||||||
" (133, 63, 'W'),\n",
|
|
||||||
" (132, 63, 'W'),\n",
|
|
||||||
" (131, 63, 'W'),\n",
|
|
||||||
" (131, 63, 'N'),\n",
|
|
||||||
" (131, 62, 'N'),\n",
|
|
||||||
" (131, 61, 'N'),\n",
|
|
||||||
" (131, 61, 'W'),\n",
|
|
||||||
" (130, 61, 'W'),\n",
|
|
||||||
" (129, 61, 'W'),\n",
|
|
||||||
" (128, 61, 'W'),\n",
|
|
||||||
" (127, 61, 'W'),\n",
|
|
||||||
" (127, 61, 'S'),\n",
|
|
||||||
" (127, 62, 'S'),\n",
|
|
||||||
" (127, 63, 'S'),\n",
|
|
||||||
" (127, 64, 'S'),\n",
|
|
||||||
" (127, 65, 'S'),\n",
|
|
||||||
" (127, 65, 'E'),\n",
|
|
||||||
" (128, 65, 'E'),\n",
|
|
||||||
" (129, 65, 'E'),\n",
|
|
||||||
" (129, 65, 'S'),\n",
|
|
||||||
" (129, 66, 'S'),\n",
|
|
||||||
" (129, 67, 'S'),\n",
|
|
||||||
" (129, 67, 'W'),\n",
|
|
||||||
" (128, 67, 'W'),\n",
|
|
||||||
" (127, 67, 'W'),\n",
|
|
||||||
" (127, 67, 'S'),\n",
|
|
||||||
" (127, 68, 'S'),\n",
|
|
||||||
" (127, 69, 'S'),\n",
|
|
||||||
" (127, 69, 'W'),\n",
|
|
||||||
" (126, 69, 'W'),\n",
|
|
||||||
" (125, 69, 'W'),\n",
|
|
||||||
" (124, 69, 'W'),\n",
|
|
||||||
" (123, 69, 'W'),\n",
|
|
||||||
" (122, 69, 'W'),\n",
|
|
||||||
" (121, 69, 'W'),\n",
|
|
||||||
" (121, 69, 'N'),\n",
|
|
||||||
" (121, 68, 'N'),\n",
|
|
||||||
" (121, 67, 'N'),\n",
|
|
||||||
" (121, 66, 'N'),\n",
|
|
||||||
" (121, 65, 'N'),\n",
|
|
||||||
" (121, 64, 'N'),\n",
|
|
||||||
" (121, 63, 'N'),\n",
|
|
||||||
" (121, 63, 'W'),\n",
|
|
||||||
" (120, 63, 'W'),\n",
|
|
||||||
" (119, 63, 'W'),\n",
|
|
||||||
" (119, 63, 'N'),\n",
|
|
||||||
" (119, 62, 'N'),\n",
|
|
||||||
" (119, 61, 'N'),\n",
|
|
||||||
" (119, 61, 'E'),\n",
|
|
||||||
" (120, 61, 'E'),\n",
|
|
||||||
" (121, 61, 'E'),\n",
|
|
||||||
" (121, 61, 'N'),\n",
|
|
||||||
" (121, 60, 'N'),\n",
|
|
||||||
" (121, 59, 'N'),\n",
|
|
||||||
" (121, 58, 'N'),\n",
|
|
||||||
" (121, 57, 'N'),\n",
|
|
||||||
" (121, 56, 'N'),\n",
|
|
||||||
" (121, 55, 'N'),\n",
|
|
||||||
" (121, 54, 'N'),\n",
|
|
||||||
" (121, 53, 'N'),\n",
|
|
||||||
" (121, 53, 'W'),\n",
|
|
||||||
" (120, 53, 'W'),\n",
|
|
||||||
" (119, 53, 'W'),\n",
|
|
||||||
" (118, 53, 'W'),\n",
|
|
||||||
" (117, 53, 'W'),\n",
|
|
||||||
" (117, 53, 'N'),\n",
|
|
||||||
" (117, 52, 'N'),\n",
|
|
||||||
" (117, 51, 'N'),\n",
|
|
||||||
" (117, 51, 'E'),\n",
|
|
||||||
" (118, 51, 'E'),\n",
|
|
||||||
" (119, 51, 'E'),\n",
|
|
||||||
" (119, 51, 'N'),\n",
|
|
||||||
" (119, 50, 'N'),\n",
|
|
||||||
" (119, 49, 'N'),\n",
|
|
||||||
" (119, 49, 'W'),\n",
|
|
||||||
" (118, 49, 'W'),\n",
|
|
||||||
" (117, 49, 'W'),\n",
|
|
||||||
" (117, 49, 'N'),\n",
|
|
||||||
" (117, 48, 'N'),\n",
|
|
||||||
" (117, 47, 'N'),\n",
|
|
||||||
" (117, 47, 'E'),\n",
|
|
||||||
" (118, 47, 'E'),\n",
|
|
||||||
" (119, 47, 'E'),\n",
|
|
||||||
" (120, 47, 'E'),\n",
|
|
||||||
" (121, 47, 'E'),\n",
|
|
||||||
" (121, 47, 'N'),\n",
|
|
||||||
" (121, 46, 'N'),\n",
|
|
||||||
" (121, 45, 'N'),\n",
|
|
||||||
" (121, 44, 'N'),\n",
|
|
||||||
" (121, 43, 'N'),\n",
|
|
||||||
" (121, 42, 'N'),\n",
|
|
||||||
" (121, 41, 'N'),\n",
|
|
||||||
" (121, 40, 'N'),\n",
|
|
||||||
" (121, 39, 'N'),\n",
|
|
||||||
" (121, 38, 'N'),\n",
|
|
||||||
" (121, 37, 'N'),\n",
|
|
||||||
" (121, 37, 'E'),\n",
|
|
||||||
" (122, 37, 'E'),\n",
|
|
||||||
" (123, 37, 'E'),\n",
|
|
||||||
" (124, 37, 'E'),\n",
|
|
||||||
" (125, 37, 'E'),\n",
|
|
||||||
" (125, 37, 'N'),\n",
|
|
||||||
" (125, 36, 'N'),\n",
|
|
||||||
" (125, 35, 'N'),\n",
|
|
||||||
" (125, 35, 'E'),\n",
|
|
||||||
" (126, 35, 'E'),\n",
|
|
||||||
" (127, 35, 'E'),\n",
|
|
||||||
" (127, 35, 'N'),\n",
|
|
||||||
" (127, 34, 'N'),\n",
|
|
||||||
" (127, 33, 'N'),\n",
|
|
||||||
" (127, 33, 'E'),\n",
|
|
||||||
" (128, 33, 'E'),\n",
|
|
||||||
" (129, 33, 'E'),\n",
|
|
||||||
" (130, 33, 'E'),\n",
|
|
||||||
" (131, 33, 'E'),\n",
|
|
||||||
" (132, 33, 'E'),\n",
|
|
||||||
" (133, 33, 'E'),\n",
|
|
||||||
" (134, 33, 'E'),\n",
|
|
||||||
" (135, 33, 'E'),\n",
|
|
||||||
" (136, 33, 'E'),\n",
|
|
||||||
" (137, 33, 'E'),\n",
|
|
||||||
" (138, 33, 'E'),\n",
|
|
||||||
" (139, 33, 'E'),\n",
|
|
||||||
" (139, 33, 'N'),\n",
|
|
||||||
" (139, 32, 'N'),\n",
|
|
||||||
" (139, 31, 'N'),\n",
|
|
||||||
" (139, 31, 'W'),\n",
|
|
||||||
" (138, 31, 'W'),\n",
|
|
||||||
" (137, 31, 'W'),\n",
|
|
||||||
" (137, 31, 'N'),\n",
|
|
||||||
" (137, 30, 'N'),\n",
|
|
||||||
" (137, 29, 'N'),\n",
|
|
||||||
" (137, 28, 'N'),\n",
|
|
||||||
" (137, 27, 'N'),\n",
|
|
||||||
" (137, 27, 'E'),\n",
|
|
||||||
" (138, 27, 'E'),\n",
|
|
||||||
" (139, 27, 'E'),\n",
|
|
||||||
" (139, 27, 'N'),\n",
|
|
||||||
" (139, 26, 'N'),\n",
|
|
||||||
" (139, 25, 'N'),\n",
|
|
||||||
" (139, 24, 'N'),\n",
|
|
||||||
" (139, 23, 'N'),\n",
|
|
||||||
" (139, 22, 'N'),\n",
|
|
||||||
" (139, 21, 'N'),\n",
|
|
||||||
" (139, 21, 'W'),\n",
|
|
||||||
" (138, 21, 'W'),\n",
|
|
||||||
" (137, 21, 'W'),\n",
|
|
||||||
" (137, 21, 'S'),\n",
|
|
||||||
" (137, 22, 'S'),\n",
|
|
||||||
" (137, 23, 'S'),\n",
|
|
||||||
" (137, 24, 'S'),\n",
|
|
||||||
" (137, 25, 'S'),\n",
|
|
||||||
" (137, 25, 'W'),\n",
|
|
||||||
" (136, 25, 'W'),\n",
|
|
||||||
" (135, 25, 'W'),\n",
|
|
||||||
" (135, 25, 'N'),\n",
|
|
||||||
" (135, 24, 'N'),\n",
|
|
||||||
" (135, 23, 'N'),\n",
|
|
||||||
" (135, 22, 'N'),\n",
|
|
||||||
" (135, 21, 'N'),\n",
|
|
||||||
" (135, 20, 'N'),\n",
|
|
||||||
" (135, 19, 'N'),\n",
|
|
||||||
" (135, 19, 'E'),\n",
|
|
||||||
" (136, 19, 'E'),\n",
|
|
||||||
" (137, 19, 'E'),\n",
|
|
||||||
" (138, 19, 'E'),\n",
|
|
||||||
" (139, 19, 'E'),\n",
|
|
||||||
" (139, 19, 'N'),\n",
|
|
||||||
" (139, 18, 'N'),\n",
|
|
||||||
" (139, 17, 'N'),\n",
|
|
||||||
" (139, 16, 'N'),\n",
|
|
||||||
" (139, 15, 'N'),\n",
|
|
||||||
" (139, 14, 'N'),\n",
|
|
||||||
" (139, 13, 'N'),\n",
|
|
||||||
" (139, 12, 'N'),\n",
|
|
||||||
" (139, 11, 'N'),\n",
|
|
||||||
" (139, 10, 'N'),\n",
|
|
||||||
" (139, 9, 'N'),\n",
|
|
||||||
" (139, 8, 'N'),\n",
|
|
||||||
" (139, 7, 'N'),\n",
|
|
||||||
" (139, 7, 'W'),\n",
|
|
||||||
" (138, 7, 'W'),\n",
|
|
||||||
" (137, 7, 'W'),\n",
|
|
||||||
" (137, 7, 'N'),\n",
|
|
||||||
" (137, 6, 'N'),\n",
|
|
||||||
" (137, 5, 'N'),\n",
|
|
||||||
" (137, 5, 'E'),\n",
|
|
||||||
" (138, 5, 'E'),\n",
|
|
||||||
" (139, 5, 'E'),\n",
|
|
||||||
" (139, 5, 'N'),\n",
|
|
||||||
" (139, 4, 'N'),\n",
|
|
||||||
" (139, 3, 'N'),\n",
|
|
||||||
" (139, 2, 'N'),\n",
|
|
||||||
" (139, 1, 'N')],\n",
|
|
||||||
" 135512)"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"execution_count": 12,
|
|
||||||
"metadata": {},
|
|
||||||
"output_type": "execute_result"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"source": [
|
"source": [
|
||||||
"import networkx as nx\n",
|
"import networkx as nx\n",
|
||||||
"\n",
|
"\n",
|
||||||
@@ -791,6 +39,9 @@
|
|||||||
" dx, dy = MOVEMENTS[direction]\n",
|
" dx, dy = MOVEMENTS[direction]\n",
|
||||||
" nx_new, ny_new = x + dx, y + dy\n",
|
" nx_new, ny_new = x + dx, y + dy\n",
|
||||||
" if 0 <= nx_new < width and 0 <= ny_new < height and rows[ny_new][nx_new] != '#':\n",
|
" if 0 <= nx_new < width and 0 <= ny_new < height and rows[ny_new][nx_new] != '#':\n",
|
||||||
|
" if rows[ny_new][nx_new] == 'E':\n",
|
||||||
|
" graph.add_edge((x, y, direction), (nx_new, ny_new), weight=1)\n",
|
||||||
|
" else:\n",
|
||||||
" graph.add_edge((x, y, direction), (nx_new, ny_new, direction), weight=1)\n",
|
" graph.add_edge((x, y, direction), (nx_new, ny_new, direction), weight=1)\n",
|
||||||
"\n",
|
"\n",
|
||||||
" # Add edges for turning (clockwise and counterclockwise)\n",
|
" # Add edges for turning (clockwise and counterclockwise)\n",
|
||||||
@@ -799,135 +50,83 @@
|
|||||||
" prev_dir = DIRECTIONS[(i - 1) % 4] # Counterclockwise\n",
|
" prev_dir = DIRECTIONS[(i - 1) % 4] # Counterclockwise\n",
|
||||||
" graph.add_edge((x, y, direction), (x, y, next_dir), weight=1000)\n",
|
" graph.add_edge((x, y, direction), (x, y, next_dir), weight=1000)\n",
|
||||||
" graph.add_edge((x, y, direction), (x, y, prev_dir), weight=1000)\n",
|
" graph.add_edge((x, y, direction), (x, y, prev_dir), weight=1000)\n",
|
||||||
" return graph, start, end\n",
|
|
||||||
"\n",
|
"\n",
|
||||||
"# Find the shortest path with the new graph\n",
|
" return graph, start, end"
|
||||||
"def find_shortest_path_with_costs(graph, start, end):\n",
|
|
||||||
" try:\n",
|
|
||||||
" # Extract all possible end states (any direction at the endpoint)\n",
|
|
||||||
" end_nodes = [(end[0], end[1], d) for d in DIRECTIONS]\n",
|
|
||||||
" shortest_cost = float('inf')\n",
|
|
||||||
" best_path = None\n",
|
|
||||||
"\n",
|
|
||||||
" # Evaluate paths to all possible orientations at the endpoint\n",
|
|
||||||
" for end_node in end_nodes:\n",
|
|
||||||
" try:\n",
|
|
||||||
" path = nx.shortest_path(graph, source=start, target=end_node, weight='weight')\n",
|
|
||||||
" cost = nx.shortest_path_length(graph, source=start, target=end_node, weight='weight')\n",
|
|
||||||
" if cost < shortest_cost:\n",
|
|
||||||
" shortest_cost = cost\n",
|
|
||||||
" best_path = path\n",
|
|
||||||
" except nx.NetworkXNoPath:\n",
|
|
||||||
" continue\n",
|
|
||||||
" return best_path, shortest_cost\n",
|
|
||||||
" except nx.NetworkXNoPath:\n",
|
|
||||||
" return None, float('inf')\n",
|
|
||||||
"\n",
|
|
||||||
"# Example ASCII map\n",
|
|
||||||
"with open('input','r') as infile:\n",
|
|
||||||
" ascii_map = infile.read()\n",
|
|
||||||
"\n",
|
|
||||||
"# Parse the map and solve\n",
|
|
||||||
"graph, start, end = parse_ascii_map_with_costs(ascii_map)\n",
|
|
||||||
"path, cost = find_shortest_path_with_costs(graph, start, end)\n",
|
|
||||||
"\n",
|
|
||||||
"# Output the results\n",
|
|
||||||
"path, cost\n"
|
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"cell_type": "code",
|
"cell_type": "code",
|
||||||
"execution_count": 13,
|
"execution_count": 73,
|
||||||
|
"metadata": {},
|
||||||
|
"outputs": [],
|
||||||
|
"source": [
|
||||||
|
"with open('input','r') as infile:\n",
|
||||||
|
" ascii_map = infile.read()\n",
|
||||||
|
"\n",
|
||||||
|
"# Parse the map and solve\n",
|
||||||
|
"graph, start, end = parse_ascii_map_with_costs(ascii_map)"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"execution_count": 74,
|
||||||
|
"metadata": {},
|
||||||
|
"outputs": [],
|
||||||
|
"source": [
|
||||||
|
"shortestpath = nx.shortest_path(graph,start,end,weight='weight')\n",
|
||||||
|
"shortestpath_cost = nx.shortest_path_length(graph,start,end,weight='weight')"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"execution_count": 75,
|
||||||
"metadata": {},
|
"metadata": {},
|
||||||
"outputs": [
|
"outputs": [
|
||||||
{
|
{
|
||||||
"name": "stdout",
|
"name": "stdout",
|
||||||
"output_type": "stream",
|
"output_type": "stream",
|
||||||
"text": [
|
"text": [
|
||||||
"Minimum Cost to Reach the End: 135512\n"
|
"135512\n"
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"source": [
|
"source": [
|
||||||
"import heapq\n",
|
"print(shortestpath_cost)"
|
||||||
"\n",
|
|
||||||
"# Define directions and corresponding movements\n",
|
|
||||||
"DIRECTIONS = ['N', 'E', 'S', 'W']\n",
|
|
||||||
"MOVEMENTS = {\n",
|
|
||||||
" 'N': (0, -1), # Move up\n",
|
|
||||||
" 'E': (1, 0), # Move right\n",
|
|
||||||
" 'S': (0, 1), # Move down\n",
|
|
||||||
" 'W': (-1, 0) # Move left\n",
|
|
||||||
"}\n",
|
|
||||||
"\n",
|
|
||||||
"def solve_maze_with_costs(ascii_map):\n",
|
|
||||||
" rows = ascii_map.strip().split(\"\\n\")\n",
|
|
||||||
" height, width = len(rows), len(rows[0])\n",
|
|
||||||
"\n",
|
|
||||||
" # Find start and end positions\n",
|
|
||||||
" start, end = None, None\n",
|
|
||||||
" for y, row in enumerate(rows):\n",
|
|
||||||
" for x, char in enumerate(row):\n",
|
|
||||||
" if char == 'S':\n",
|
|
||||||
" start = (x, y, 'E') # Start facing North\n",
|
|
||||||
" elif char == 'E':\n",
|
|
||||||
" end = (x, y)\n",
|
|
||||||
" \n",
|
|
||||||
" # Priority queue for Dijkstra's algorithm\n",
|
|
||||||
" pq = []\n",
|
|
||||||
" heapq.heappush(pq, (0, start)) # (cost, (x, y, direction))\n",
|
|
||||||
"\n",
|
|
||||||
" # Visited states: {(x, y, direction): cost}\n",
|
|
||||||
" visited = {}\n",
|
|
||||||
"\n",
|
|
||||||
" while pq:\n",
|
|
||||||
" cost, (x, y, direction) = heapq.heappop(pq)\n",
|
|
||||||
"\n",
|
|
||||||
" # Goal check: If we reach the endpoint\n",
|
|
||||||
" if (x, y) == end:\n",
|
|
||||||
" return cost\n",
|
|
||||||
"\n",
|
|
||||||
" # Avoid revisiting with higher cost\n",
|
|
||||||
" if (x, y, direction) in visited and visited[(x, y, direction)] <= cost:\n",
|
|
||||||
" continue\n",
|
|
||||||
" visited[(x, y, direction)] = cost\n",
|
|
||||||
"\n",
|
|
||||||
" # 1. Move forward\n",
|
|
||||||
" dx, dy = MOVEMENTS[direction]\n",
|
|
||||||
" nx, ny = x + dx, y + dy\n",
|
|
||||||
" if 0 <= nx < width and 0 <= ny < height and rows[ny][nx] != '#':\n",
|
|
||||||
" heapq.heappush(pq, (cost + 1, (nx, ny, direction)))\n",
|
|
||||||
"\n",
|
|
||||||
" # 2. Rotate clockwise\n",
|
|
||||||
" next_direction = DIRECTIONS[(DIRECTIONS.index(direction) + 1) % 4]\n",
|
|
||||||
" heapq.heappush(pq, (cost + 1000, (x, y, next_direction)))\n",
|
|
||||||
"\n",
|
|
||||||
" # 3. Rotate counterclockwise\n",
|
|
||||||
" prev_direction = DIRECTIONS[(DIRECTIONS.index(direction) - 1) % 4]\n",
|
|
||||||
" heapq.heappush(pq, (cost + 1000, (x, y, prev_direction)))\n",
|
|
||||||
" \n",
|
|
||||||
" return float('inf') # No path found\n",
|
|
||||||
"\n",
|
|
||||||
"# Example ASCII map\n",
|
|
||||||
"with open('input','r') as infile:\n",
|
|
||||||
" ascii_map = infile.read()\n",
|
|
||||||
"\n",
|
|
||||||
"# Solve the maze\n",
|
|
||||||
"cost = solve_maze_with_costs(ascii_map)\n",
|
|
||||||
"print(\"Minimum Cost to Reach the End:\", cost)\n"
|
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"cell_type": "code",
|
"cell_type": "code",
|
||||||
"execution_count": null,
|
"execution_count": 76,
|
||||||
"metadata": {},
|
"metadata": {},
|
||||||
"outputs": [],
|
"outputs": [
|
||||||
"source": []
|
{
|
||||||
|
"data": {
|
||||||
|
"text/plain": [
|
||||||
|
"541"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"execution_count": 76,
|
||||||
|
"metadata": {},
|
||||||
|
"output_type": "execute_result"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"source": [
|
||||||
|
"\n",
|
||||||
|
"\n",
|
||||||
|
"paths = nx.all_shortest_paths(graph,source=start,target=end,weight='weight')\n",
|
||||||
|
"visited_nodes = set()\n",
|
||||||
|
"\n",
|
||||||
|
"for path in paths:\n",
|
||||||
|
" for grid_node in path:\n",
|
||||||
|
" visited_nodes.add((grid_node[0],grid_node[1]))\n",
|
||||||
|
"\n",
|
||||||
|
"len(visited_nodes)"
|
||||||
|
]
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"metadata": {
|
"metadata": {
|
||||||
"kernelspec": {
|
"kernelspec": {
|
||||||
"display_name": "pdf",
|
"display_name": "advent",
|
||||||
"language": "python",
|
"language": "python",
|
||||||
"name": "python3"
|
"name": "python3"
|
||||||
},
|
},
|
||||||
@@ -941,7 +140,7 @@
|
|||||||
"name": "python",
|
"name": "python",
|
||||||
"nbconvert_exporter": "python",
|
"nbconvert_exporter": "python",
|
||||||
"pygments_lexer": "ipython3",
|
"pygments_lexer": "ipython3",
|
||||||
"version": "3.12.7"
|
"version": "3.13.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"nbformat": 4,
|
"nbformat": 4,
|
||||||
|
|||||||
@@ -0,0 +1,131 @@
|
|||||||
|
{
|
||||||
|
"cells": [
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"execution_count": 1,
|
||||||
|
"metadata": {},
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"name": "stdout",
|
||||||
|
"output_type": "stream",
|
||||||
|
"text": [
|
||||||
|
"all visited nodes for cheapest path: {(113, 26), (132, 39), (71, 29), (16, 93), (134, 85), (111, 101), (50, 91), (83, 39), (127, 45), (27, 107), (25, 34), (85, 48), (117, 37), (62, 101), (103, 102), (122, 115), (106, 107), (39, 117), (139, 55), (59, 32), (78, 45), (23, 109), (97, 58), (96, 99), (55, 61), (113, 39), (13, 101), (57, 107), (131, 56), (29, 45), (115, 48), (15, 110), (18, 115), (133, 102), (6, 61), (92, 101), (105, 40), (124, 53), (69, 117), (108, 45), (127, 58), (25, 47), (85, 61), (30, 125), (103, 115), (101, 5), (1, 67), (87, 107), (59, 45), (45, 110), (119, 59), (64, 123), (36, 61), (99, 117), (11, 4), (52, 5), (57, 120), (98, 121), (131, 69), (115, 61), (15, 123), (54, 51), (133, 115), (31, 67), (64, 15), (91, 118), (105, 53), (3, 5), (94, 123), (66, 61), (11, 125), (98, 13), (43, 77), (82, 5), (101, 18), (1, 80), (45, 123), (17, 61), (3, 126), (77, 75), (75, 2), (61, 67), (135, 16), (33, 5), (93, 19), (79, 121), (137, 62), (101, 139), (128, 13), (40, 129), (73, 77), (67, 3), (12, 67), (31, 80), (91, 131), (130, 59), (75, 123), (89, 21), (135, 137), (107, 75), (52, 139), (5, 27), (79, 13), (65, 78), (63, 5), (123, 19), (68, 83), (109, 121), (67, 124), (86, 137), (70, 129), (3, 139), (135, 29), (121, 131), (33, 18), (74, 19), (19, 83), (63, 126), (137, 75), (82, 139), (51, 35), (35, 27), (21, 129), (109, 13), (67, 16), (53, 81), (86, 29), (116, 137), (9, 11), (47, 37), (33, 139), (129, 76), (65, 91), (63, 18), (49, 83), (109, 134), (21, 21), (81, 35), (67, 137), (39, 38), (9, 132), (83, 81), (116, 29), (19, 96), (63, 139), (16, 27), (35, 40), (95, 91), (34, 81), (53, 94), (139, 97), (37, 86), (111, 35), (56, 99), (28, 37), (129, 89), (113, 81), (27, 41), (90, 97), (7, 99), (122, 49), (125, 91), (39, 51), (23, 43), (83, 94), (96, 33), (41, 97), (25, 89), (13, 35), (99, 38), (118, 51), (57, 41), (2, 105), (136, 105), (139, 110), (37, 99), (97, 113), (69, 51), (14, 115), (55, 116), (8, 41), (113, 94), (11, 46), (71, 97), (131, 111), (103, 49), (48, 113), (87, 41), (23, 56), (105, 95), (127, 113), (25, 102), (99, 51), (85, 116), (57, 54), (43, 119), (117, 105), (15, 57), (133, 49), (78, 113), (31, 1), (17, 103), (50, 51), (91, 52), (55, 129), (94, 57), (11, 59), (85, 8), (112, 111), (131, 124), (84, 49), (29, 113), (43, 11), (1, 14), (73, 119), (6, 129), (45, 57), (119, 6), (105, 108), (77, 9), (61, 1), (121, 52), (85, 129), (79, 55), (24, 119), (43, 132), (115, 8), (15, 70), (101, 73), (1, 135), (73, 11), (59, 113), (18, 75), (119, 127), (12, 1), (31, 14), (91, 65), (77, 130), (75, 57), (135, 71), (80, 135), (107, 9), (52, 73), (24, 11), (65, 12), (115, 129), (109, 55), (54, 119), (86, 71), (31, 135), (3, 73), (77, 22), (42, 1), (61, 14), (47, 79), (80, 27), (107, 130), (121, 65), (19, 17), (65, 133), (98, 81), (63, 60), (137, 9), (82, 73), (21, 63), (53, 15), (116, 71), (61, 135), (135, 84), (88, 9), (33, 73), (107, 22), (93, 87), (65, 25), (51, 90), (137, 130), (49, 17), (95, 133), (7, 20), (67, 71), (12, 135), (26, 33), (130, 127), (89, 89), (83, 15), (47, 92), (60, 31), (5, 95), (63, 73), (137, 22), (123, 87), (21, 76), (95, 25), (40, 89), (34, 15), (139, 31), (39, 93), (125, 133), (56, 33), (129, 23), (113, 15), (13, 77), (46, 25), (51, 103), (49, 30), (90, 31), (35, 95), (7, 33), (67, 84), (125, 25), (70, 89), (9, 79), (83, 28), (69, 93), (102, 41), (41, 31), (25, 23), (123, 100), (117, 26), (81, 103), (120, 31), (20, 93), (139, 44), (39, 106), (37, 33), (138, 85), (97, 47), (55, 50), (99, 93), (71, 31), (16, 95), (131, 45), (76, 109), (29, 34), (134, 87), (48, 47), (111, 103), (9, 92), (50, 93), (105, 29), (69, 106), (41, 44), (127, 47), (27, 109), (11, 101), (76, 1), (62, 103), (117, 39), (59, 34), (23, 111), (55, 63), (27, 1), (99, 106), (118, 119), (71, 44), (57, 109), (29, 47), (115, 50), (15, 112), (18, 117), (6, 63), (92, 103), (91, 107), (22, 7), (8, 109), (108, 47), (11, 114), (85, 63), (57, 1), (43, 66), (103, 117), (15, 4), (101, 7), (1, 69), (87, 109), (59, 47), (119, 61), (36, 63), (3, 115), (121, 107), (80, 69), (52, 7), (115, 63), (15, 125), (101, 128), (87, 1), (54, 53), (133, 117), (45, 4), (86, 5), (31, 69), (91, 120), (110, 133), (3, 7), (94, 125), (33, 115), (126, 77), (43, 79), (84, 117), (87, 122), (45, 125), (119, 74), (89, 131), (77, 77), (61, 69), (135, 18), (121, 120), (33, 7), (93, 21), (79, 123), (63, 115), (137, 64), (51, 24), (10, 23), (40, 131), (67, 5), (31, 82), (130, 61), (75, 125), (89, 23), (135, 139), (28, 13), (47, 26), (107, 77), (46, 67), (5, 29), (79, 15), (63, 7), (49, 72), (123, 21), (68, 85), (109, 123), (21, 10), (67, 126), (86, 139), (125, 67), (70, 131), (42, 69), (102, 83), (135, 31), (19, 85), (93, 34), (63, 128), (137, 77), (51, 37), (35, 29), (21, 131), (95, 80), (53, 83), (70, 23), (111, 24), (116, 139), (9, 13), (14, 91), (88, 77), (129, 78), (47, 39), (5, 42), (65, 93), (104, 21), (49, 85), (21, 23), (81, 37), (67, 139), (125, 80), (23, 32), (9, 134), (83, 83), (138, 19), (41, 86), (60, 99), (13, 24), (16, 29), (117, 81), (76, Line truncated
|
||||||
|
"cost of cheapest path: 135512\n"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"source": [
|
||||||
|
"import heapq\n",
|
||||||
|
"\n",
|
||||||
|
"# Define directions and corresponding movements\n",
|
||||||
|
"DIRECTIONS = ['N', 'E', 'S', 'W']\n",
|
||||||
|
"MOVEMENTS = {\n",
|
||||||
|
" 'N': (0, -1), # Move up\n",
|
||||||
|
" 'E': (1, 0), # Move right\n",
|
||||||
|
" 'S': (0, 1), # Move down\n",
|
||||||
|
" 'W': (-1, 0) # Move left\n",
|
||||||
|
"}\n",
|
||||||
|
"\n",
|
||||||
|
"def solve_maze_with_costs(ascii_map):\n",
|
||||||
|
" rows = ascii_map.strip().split(\"\\n\")\n",
|
||||||
|
" height, width = len(rows), len(rows[0])\n",
|
||||||
|
"\n",
|
||||||
|
" # Find start and end positions\n",
|
||||||
|
" start, end = None, None\n",
|
||||||
|
" for y, row in enumerate(rows):\n",
|
||||||
|
" for x, char in enumerate(row):\n",
|
||||||
|
" if char == 'S':\n",
|
||||||
|
" start = (x, y, 'E') # Start facing North\n",
|
||||||
|
" elif char == 'E':\n",
|
||||||
|
" end = (x, y)\n",
|
||||||
|
" \n",
|
||||||
|
" # Priority queue for Dijkstra's algorithm\n",
|
||||||
|
" pq = []\n",
|
||||||
|
" heapq.heappush(pq, (0, start)) # (cost, (x, y, direction))\n",
|
||||||
|
"\n",
|
||||||
|
" # Visited states: {(x, y, direction): cost}\n",
|
||||||
|
" visited = {}\n",
|
||||||
|
"\n",
|
||||||
|
" while pq:\n",
|
||||||
|
" cost, (x, y, direction) = heapq.heappop(pq)\n",
|
||||||
|
"\n",
|
||||||
|
" # Goal check: If we reach the endpoint\n",
|
||||||
|
" if (x, y) == end:\n",
|
||||||
|
" yield cost,visited\n",
|
||||||
|
"\n",
|
||||||
|
" # Avoid revisiting with higher cost\n",
|
||||||
|
" if (x, y, direction) in visited and visited[(x, y, direction)] <= cost:\n",
|
||||||
|
" continue\n",
|
||||||
|
" visited[(x, y, direction)] = cost\n",
|
||||||
|
"\n",
|
||||||
|
" # 1. Move forward\n",
|
||||||
|
" dx, dy = MOVEMENTS[direction]\n",
|
||||||
|
" nx, ny = x + dx, y + dy\n",
|
||||||
|
" if 0 <= nx < width and 0 <= ny < height and rows[ny][nx] != '#':\n",
|
||||||
|
" heapq.heappush(pq, (cost + 1, (nx, ny, direction)))\n",
|
||||||
|
"\n",
|
||||||
|
" # 2. Rotate clockwise\n",
|
||||||
|
" next_direction = DIRECTIONS[(DIRECTIONS.index(direction) + 1) % 4]\n",
|
||||||
|
" heapq.heappush(pq, (cost + 1000, (x, y, next_direction)))\n",
|
||||||
|
"\n",
|
||||||
|
" # 3. Rotate counterclockwise\n",
|
||||||
|
" prev_direction = DIRECTIONS[(DIRECTIONS.index(direction) - 1) % 4]\n",
|
||||||
|
" heapq.heappush(pq, (cost + 1000, (x, y, prev_direction)))\n",
|
||||||
|
" \n",
|
||||||
|
" return float('inf') # No path found\n",
|
||||||
|
"\n",
|
||||||
|
"# Example ASCII map\n",
|
||||||
|
"with open('input','r') as infile:\n",
|
||||||
|
" ascii_map = infile.read()\n",
|
||||||
|
"\n",
|
||||||
|
"# Solve the maze\n",
|
||||||
|
"minkost = float('inf')\n",
|
||||||
|
"\n",
|
||||||
|
"visited_nodes = {}\n",
|
||||||
|
"for cost,visited in solve_maze_with_costs(ascii_map):\n",
|
||||||
|
" # Strip visited to just coordinates\n",
|
||||||
|
" visited = {(x, y) for x, y, _ in visited}\n",
|
||||||
|
" if cost in visited_nodes:\n",
|
||||||
|
" visited_nodes[cost].update(visited)\n",
|
||||||
|
" else:\n",
|
||||||
|
" visited_nodes[cost] = set(visited)\n",
|
||||||
|
" if cost < minkost:\n",
|
||||||
|
" minkost = cost\n",
|
||||||
|
"\n",
|
||||||
|
"print(f\"all visited nodes for cheapest path: {visited_nodes[minkost]}\")\n",
|
||||||
|
"print(f\"cost of cheapest path: {minkost}\")\n",
|
||||||
|
"\n",
|
||||||
|
"\n",
|
||||||
|
" \n"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"execution_count": null,
|
||||||
|
"metadata": {},
|
||||||
|
"outputs": [],
|
||||||
|
"source": []
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"metadata": {
|
||||||
|
"kernelspec": {
|
||||||
|
"display_name": "advent",
|
||||||
|
"language": "python",
|
||||||
|
"name": "python3"
|
||||||
|
},
|
||||||
|
"language_info": {
|
||||||
|
"codemirror_mode": {
|
||||||
|
"name": "ipython",
|
||||||
|
"version": 3
|
||||||
|
},
|
||||||
|
"file_extension": ".py",
|
||||||
|
"mimetype": "text/x-python",
|
||||||
|
"name": "python",
|
||||||
|
"nbconvert_exporter": "python",
|
||||||
|
"pygments_lexer": "ipython3",
|
||||||
|
"version": "3.13.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"nbformat": 4,
|
||||||
|
"nbformat_minor": 2
|
||||||
|
}
|
||||||
Reference in new issue
Block a user