


import os






def 						a__			(				):
			SCREAMING_SNAKE_CASE_		:     Optional[Any]					=					os.path.join(os.path.dirname(A__				),      'num.txt'				)
			with open(A__				) as file_hand:
						return str(sum(int(A__				) for line in file_hand				)				)[:1_0]


if __name__ == "__main__":
				print(solution())









from __future__ import annotations

lowerCAmelCase__			:      Union[str, Any]								=[
    [-1, 0],  # left
    [0, -1],  # down
    [1, 0],  # right
    [0, 1],  # up
]






def 						a__			(				A__,      A__,      A__,      A__,      A__,      ):
			SCREAMING_SNAKE_CASE_		:     List[Any]					=					[
			    [0 for col in range(len(grid[0]				)				)] for row in range(len(A__				)				)
			]  # the reference grid
			SCREAMING_SNAKE_CASE_		:     List[Any]					=					1
			SCREAMING_SNAKE_CASE_		:     Union[str, Any]					=					[
			    [0 for col in range(len(grid[0]				)				)] for row in range(len(A__				)				)
			]  # the action grid

			SCREAMING_SNAKE_CASE_		:     Optional[int]					=					init[0]
			SCREAMING_SNAKE_CASE_		:     List[str]					=					init[1]
			SCREAMING_SNAKE_CASE_		:     Dict					=					0
			SCREAMING_SNAKE_CASE_		:     List[Any]					=					g + heuristic[x][y]  # cost from starting cell to destination cell
			SCREAMING_SNAKE_CASE_		:     List[str]					=					[[f, g, x, y]]

			SCREAMING_SNAKE_CASE_		:     Dict					=					False  # flag that is set when search is complete
			SCREAMING_SNAKE_CASE_		:     Tuple					=					False  # flag set if we can't find expand

			while not found and not resign:
						if len(A__				) == 0:
									raise ValueError('Algorithm is unable to find solution'				)
						else:  # to choose the least costliest action so as to move closer to the goal
									cell.sort()
									cell.reverse()
									SCREAMING_SNAKE_CASE_		:     Any					=					cell.pop()
									SCREAMING_SNAKE_CASE_		:     Any					=					next_cell[2]
									SCREAMING_SNAKE_CASE_		:     str					=					next_cell[3]
									SCREAMING_SNAKE_CASE_		:     Tuple					=					next_cell[1]

									if x == goal[0] and y == goal[1]:
												SCREAMING_SNAKE_CASE_		:     Dict					=					True
									else:
												for i in range(len(A__				)				):  # to try out different valid actions
															SCREAMING_SNAKE_CASE_		:     Optional[int]					=					x + DIRECTIONS[i][0]
															SCREAMING_SNAKE_CASE_		:     List[Any]					=					y + DIRECTIONS[i][1]
															if xa >= 0 and xa < len(A__				) and ya >= 0 and ya < len(grid[0]				):
																		if closed[xa][ya] == 0 and grid[xa][ya] == 0:
																					SCREAMING_SNAKE_CASE_		:     List[Any]					=					g + cost
																					SCREAMING_SNAKE_CASE_		:     List[Any]					=					ga + heuristic[xa][ya]
																					cell.append([fa, ga, xa, ya]				)
																					SCREAMING_SNAKE_CASE_		:     int					=					1
																					SCREAMING_SNAKE_CASE_		:     int					=					i
			SCREAMING_SNAKE_CASE_		:     Union[str, Any]					=					[]
			SCREAMING_SNAKE_CASE_		:     List[str]					=					goal[0]
			SCREAMING_SNAKE_CASE_		:     Optional[Any]					=					goal[1]
			invpath.append([x, y]				)  # we get the reverse path from here
			while x != init[0] or y != init[1]:
						SCREAMING_SNAKE_CASE_		:     Any					=					x - DIRECTIONS[action[x][y]][0]
						SCREAMING_SNAKE_CASE_		:     int					=					y - DIRECTIONS[action[x][y]][1]
						SCREAMING_SNAKE_CASE_		:     int					=					xa
						SCREAMING_SNAKE_CASE_		:     List[Any]					=					ya
						invpath.append([x, y]				)

			SCREAMING_SNAKE_CASE_		:     List[Any]					=					[]
			for i in range(len(A__				)				):
						path.append(invpath[len(A__				) - 1 - i]				)
			return path, action


if __name__ == "__main__":
				lowerCAmelCase__			:      Union[str, Any]								=[
				    [0, 1, 0, 0, 0, 0],
				    [0, 1, 0, 0, 0, 0],  # 0 are free path whereas 1's are obstacles
				    [0, 1, 0, 0, 0, 0],
				    [0, 1, 0, 0, 1, 0],
				    [0, 0, 0, 0, 1, 0],
				]

				lowerCAmelCase__			:      Any								=[0, 0]
				# all coordinates are given in format [y,x]
				lowerCAmelCase__			:      List[str]								=[len(grid) - 1, len(grid[0]) - 1]
				lowerCAmelCase__			:      str								=1

				# the cost map which pushes the path closer to the goal
				lowerCAmelCase__			:      Union[str, Any]								=[[0 for row in range(len(grid[0]))] for col in range(len(grid))]
				for i in range(len(grid)):
								for j in range(len(grid[0])):
												lowerCAmelCase__			:      List[str]								=abs(i - goal[0]) + abs(j - goal[1])
												if grid[i][j] == 1:
																# added extra penalty in the heuristic map
																lowerCAmelCase__			:      List[str]								=99

				lowerCAmelCase__							,lowerCAmelCase__			:      Any								=search(grid, init, goal, cost, heuristic)

				print('ACTION MAP')
				for i in range(len(action)):
								print(action[i])

				for i in range(len(path)):
								print(path[i])





