{ "cells": [ { "cell_type": "code", "execution_count": 10, "metadata": {}, "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": [ "import networkx as nx\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", "# Parse the ASCII map into a graph with movement and turning costs\n", "def parse_ascii_map_with_costs(ascii_map):\n", " graph = nx.DiGraph() # Directed graph for handling edge weights\n", " rows = ascii_map.strip().split(\"\\n\")\n", " height, width = len(rows), len(rows[0])\n", "\n", " start, end = None, None\n", " for y, row in enumerate(rows):\n", " for x, char in enumerate(row):\n", " if char != '#': # Walkable space\n", " for direction in DIRECTIONS: # Add a node for each direction\n", " graph.add_node((x, y, direction))\n", " if char == 'S': # Starting point\n", " start = (x, y, 'E') # Assume starting direction is North\n", " elif char == 'E': # Ending point\n", " end = (x, y)\n", "\n", " # Add edges for moving forward\n", " for direction in DIRECTIONS:\n", " dx, dy = MOVEMENTS[direction]\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, direction), (nx_new, ny_new, direction), weight=1)\n", "\n", " # Add edges for turning (clockwise and counterclockwise)\n", " for i, direction in enumerate(DIRECTIONS):\n", " next_dir = DIRECTIONS[(i + 1) % 4] # Clockwise\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, prev_dir), weight=1000)\n", " return graph, start, end\n", "\n", "# Find the shortest path with the new graph\n", "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", "execution_count": 13, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Minimum Cost to Reach the End: 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", " 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", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "pdf", "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.12.7" } }, "nbformat": 4, "nbformat_minor": 2 }