Files
2024-10-31 05:30:28 +03:00

136 lines
4.4 KiB
Python

import time
# Constants and Initialization
MAP_SIZE = 9
start = (0, 0) # initial position of Neo
neo = start # position of Neo
observer = neo
keymaster = () # position of Keymaster
closed_cells = []
blocked_cells = []
passed_cells = []
steps_count = 0
accumulated_g = 0
weighted_map_dict = dict()
# Helper Functions
def get_position_input():
position_input_list = input().split(" ")
return int(position_input_list[0]), int(position_input_list[1])
def get_walkable_cells(obj:tuple):
potential_positions = [
(obj[0], obj[1] + 1), (obj[0], obj[1] - 1),
(obj[0] - 1, obj[1]), (obj[0] + 1, obj[1])
]
return [pos for pos in potential_positions if pos[0] in range(MAP_SIZE) and pos[1] in range(MAP_SIZE) and pos not in closed_cells]
def get_g(cell):
return accumulated_g + 1
def get_h(cell):
return abs(keymaster[0] - cell[0]) + abs(keymaster[1] - cell[1])
def get_f(cell):
return get_g(cell) + get_h(cell)
'''def get_verified_move_position(new_position):
if new_position in get_walkable_cells():
return new_position
else:
print("CAN'T MOVE HERE!")
return neo'''
def print_map():
map_str = ""
for x in range(MAP_SIZE):
for y in range(MAP_SIZE):
if x == neo[0] and y == neo[1]:
map_str += " n "
elif (x == observer[0] and y == observer[1]):
map_str += " o "
elif (x == keymaster[0] and y == keymaster[1]):
map_str += " k "
elif ((x,y) in passed_cells):
map_str += " # "
elif ((x,y) in closed_cells):
map_str += " = "
elif ((x,y) in blocked_cells):
map_str += " - "
else:
map_str += " + "
map_str += "\n"
print(map_str)
def read_system():
number_of_items = int(input())
if number_of_items == 0:
return False
items = {}
for _ in range(number_of_items):
x, y, status = input().split(' ')
items[(int(x), int(y))] = status
return items
def regenerate_route():
global closed_cells, observer
accumulated_g = 0
finish = False
while not finish:
walkable_cells_and_f = {cell: get_f(cell) for cell in get_walkable_cells(observer) if cell not in blocked_cells}
min_f_value = min(walkable_cells_and_f.values())
min_f_cell_list = [cell for cell, f_value in walkable_cells_and_f.items() if f_value == min_f_value]
if len(min_f_cell_list) == 1:
next_cell = min_f_cell_list[0]
else:
next_cell = min(min_f_cell_list, key=lambda cell: get_h(cell))
observer = next_cell
accumulated_g += 1 # TODO ENSURE THAT g WORKS PROPERLY
closed_cells.append(next_cell)
print(f"m {next_cell[1]} {next_cell[0]}") # TODO FIX OR ENSURE THAT x,y OR y,x DOES NOT MAKE ANY DIFFERENCE
print_map()
time.sleep(0.2)
finish = (observer == keymaster)
def initialize_weighted_map_dict():
for x in range(MAP_SIZE):
for y in range(MAP_SIZE):
weighted_map_dict[(x, y)] = (float("inf"), float("inf"), float("inf"), '+') # (x,y) : (h, g, f, type)
# Main Logic
perception_radius = input()
keymaster = get_position_input()
print(f"m {neo[0]} {neo[1]}")
closed_cells.extend((0, 0)) #TODO FIX START CELL SET TO =
finish = False
while not finish:
observer = neo
regenerate_route()
recieved_input = read_system()
if recieved_input:
blocked_cells.extend([pos for pos, status in recieved_input.items() if status == "P"])
walkable_cells_and_f = {cell: get_f(cell) for cell in get_walkable_cells(neo) if cell not in blocked_cells}
min_f_value = min(walkable_cells_and_f.values())
min_f_cell_list = [cell for cell, f_value in walkable_cells_and_f.items() if f_value == min_f_value]
if len(min_f_cell_list) == 1:
next_cell = min_f_cell_list[0]
else:
next_cell = min(min_f_cell_list, key=lambda cell: get_h(cell))
neo = next_cell
accumulated_g += 1 # TODO ENSURE THAT g WORKS PROPERLY
closed_cells.append(next_cell) # TODO DELETE
passed_cells.append(next_cell)
print(f"m {next_cell[1]} {next_cell[0]}") # TODO FIX OR ENSURE THAT x,y OR y,x DOES NOT MAKE ANY DIFFERENCE
steps_count += 1
#print_map()
finish = (neo == keymaster)
print(f"e {steps_count}")
# TODO CHECK TESTS FROM CODEFORCES