Add 16
This commit is contained in:
949
16/16.ipynb
Normal file
949
16/16.ipynb
Normal file
@@ -0,0 +1,949 @@
|
||||
{
|
||||
"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
|
||||
}
|
||||
Reference in New Issue
Block a user