Итоговое тестирование в скриптах
Author
function get_path( координаты_старта, направление, изученная_карта, пройденная_карта )
#################
# Заполняем маску
#################
wavefront = zeros( size(изученная_карта) ) # поле отмечаем цифрой 0 - по этим точкам можно ходить
wavefront[ изученная_карта .== здесь_стена] .= -1 # точки известных нам стен отметим -1 (скорее для визуализации)
wavefront[ координаты_старта ] = 2 # отправную точку робота отметим цифрой 2
wavefront[ (пройденная_карта .== не_посещали) .& (изученная_карта .== не_знаю) ] .= 1 # все точки, куда мы хотим попасть, отмечаем цифрой 1
vec_coords = CartesianIndices( size(wavefront) )
##############################################
# Размечаем маску и находим потенциальную цель
##############################################
маршрут = []
for cntr in 1:200
if length(маршрут) > 0 break; end;
периметр = vec_coords[ wavefront .== maximum(wavefront) ]
for точка in периметр
if length(маршрут) > 0 break; end;
набор_направлений = [ направление, поворот(направление, 90), поворот(направление, -90), поворот(направление, 180) ]
for направление in набор_направлений
if wavefront[ точка + направление ] == 1
# Волшебно, мы нашли интересующую нас точку, можно заканчивать поиск
push!( маршрут, точка + направление )
push!( маршрут, точка );
break;
end;
if wavefront[ точка + направление ] == 0 # Шагаем в ту точку, до которой еще не расчитали маршрут
if изученная_карта[ точка + направление ] != здесь_стена wavefront[ точка + направление ] = wavefront[ точка ] + 1; end
end
end
end
end
#############################################
# Реконструкция маршрута по заполненной маске
#############################################
if length(маршрут) > 0
for p in 1:500
# Маршрут заполняется в обратную сторону
# - первая точка маршрута – это неоткрытая точка карты
# - последняя точка – текущее положение робота
последняя_точка = маршрут[end];
if wavefront[последняя_точка] == 2 break; end;
# Отфильтруем соседние точки маски, которые могут быть продолжением маршрута
соседние_точки = repeat( [последняя_точка], inner=4) .+ CartesianIndex.([(1,0), (0,1), (-1,0), (0,-1) ])
соседние_точки = [ x for x in соседние_точки if x in vec_coords ] # Проверим что мы в пределах поля
соседние_точки = [ x for x in соседние_точки if wavefront[x] >= 2 ] # Проверим что это не стены и не недоступное поле
# Добавим минимальную точку в маршрут
(_,i) = findmin( wavefront[ соседние_точки ] )
push!( маршрут, соседние_точки[i] );
end
end
return маршрут
end;