Advertisement
Guest User

Untitled

a guest
Dec 16th, 2024
172
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.65 KB | None | 0 0
  1. # Input: grid of # . S (initially facing east) E
  2. # Output: cheapest path from S to E, 1 point per move + 1000 per turn
  3.  
  4. def get_number_adjacent_walls(r, c):
  5.   adjacent_walls = 0
  6.   if grid[r - 1][c] == "#":
  7.     adjacent_walls += 1
  8.   if grid[r + 1][c] == "#":
  9.     adjacent_walls += 1
  10.   if grid[r][c - 1] == "#":
  11.     adjacent_walls += 1
  12.   if grid[r][c + 1] == "#":
  13.     adjacent_walls += 1
  14.   return adjacent_walls
  15.  
  16. def get_node_key(r, c, dr, dc):
  17.   return str(r) + "," + str(c) + "," + str(dr) + "," + str(dc)
  18.  
  19. def get_node_values(node):
  20.   return list(map(int, node.split(",")))
  21.  
  22. def get_cheapest_unvisited_node():
  23.   cheapest_node = None
  24.   cheapest_cost = -1
  25.   for node in unvisited_nodes:
  26.     if nodes[node] >= 0:
  27.       if cheapest_cost == -1 or cheapest_cost > nodes[node]:
  28.         cheapest_node = node
  29.         cheapest_cost = nodes[node]
  30.   return cheapest_node
  31.  
  32. grid = []
  33.  
  34. sr, sc, er, ec = -1, -1, -1, -1
  35.  
  36. r = 0
  37. file = open("16_input.txt", "r")
  38. for line in file:
  39.   line = line.replace("\n", "")
  40.   c = 0
  41.   row = []
  42.   for character in line:
  43.     if character == "S":
  44.       sr, sc = r, c
  45.       character = "."
  46.     if character == "E":
  47.       er, ec = r, c
  48.       character = "."
  49.     row.append(character)
  50.     c += 1
  51.   grid.append(row)
  52.   r += 1
  53.  
  54. # set of all nodes and their known distance from the start
  55. nodes = {}
  56. for r in range(1, len(grid) - 1):
  57.   for c in range(1, len(grid[0]) - 1):
  58.     if grid[r][c] == ".":
  59.       nodes[get_node_key(r, c, -1, 0)] = -1
  60.       nodes[get_node_key(r, c, 1, 0)] = -1
  61.       nodes[get_node_key(r, c, 0, -1)] = -1
  62.       nodes[get_node_key(r, c, 0, 1)] = -1
  63. nodes[get_node_key(sr, sc, 0, 1)] = 0
  64.  
  65. unvisited_nodes = []
  66. for node in nodes:
  67.   unvisited_nodes.append(node)
  68.  
  69. while len(unvisited_nodes) > 0:
  70.   node = get_cheapest_unvisited_node()
  71.   unvisited_nodes.remove(node)
  72.   nv = get_node_values(node)
  73.   if nv[0] == er and nv[1] == ec:
  74.     print (nodes[node])
  75.     break
  76.   cr, cc, dr, dc = nv[0], nv[1], nv[2], nv[3]
  77.   # evaluate continuing in current direction
  78.   new_node = get_node_key(cr + dr, cc + dc, dr, dc)
  79.   distance = nodes[node] + 1
  80.   if new_node in nodes and (nodes[new_node] == -1 or nodes[new_node] > distance):
  81.     nodes[new_node] = distance
  82.   # evaluate turning counterclockwise
  83.   new_node = get_node_key(cr, cc, -dc, dr)
  84.   distance = nodes[node] + 1000
  85.   if new_node in nodes and (nodes[new_node] == -1 or nodes[new_node] > distance):
  86.     nodes[new_node] = distance
  87.   # evaluate turning clockwise
  88.   new_node = get_node_key(cr, cc, dc, -dr)
  89.   distance = nodes[node] + 1000
  90.   if new_node in nodes and (nodes[new_node] == -1 or nodes[new_node] > distance):
  91.     nodes[new_node] = distance
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement