Я пытаюсь решить проблему кодирования Детская игра на Codingame с использованием python. С моей программой я могу пройти первые два тестовых случая, но когда тест требует много циклов, моя программа проходит по таймауту. Что я могу улучшить?
Чтобы полностью понять проблему, нужны детали задачи, но я не хочу копировать и вставлять их здесь, потому что я не уверен, что это разрешено.
Я пытаюсь объяснить проблему своими словами. С учетом этого ввода:
12 6
987
...#........
...........#
............
............
..#O........
..........#.
O
является отправной точкой персонажа. #
- стены, на которые вы не можете наступить .
где символ может шагать
В этом примере w = 12 (ширина матрицы) и h = 6 (высота матрицы). n = 987 - это количество шагов, которое должен выполнить персонаж.
Обязательный вывод :
В этом случае 7 1
позиция символа после числаданные движения
Правила :
- Персонаж всегда начинает двигаться вверх
- Когда встречается стена, персонаж поворачивается по часовой стрелке и продолжает двигаться
- Стены расположены так, что персонаж не может застрять и не может выйти из матрицы.
Когда я запускаю программу с этим тестом, я получаю правильный результат.
При использовании следующего контрольного примера:
14 10
123456789
..#...........
....#..#......
.#O.....#.....
..............
..............
.......##...#.
............#.
.#........###.
.#.#..........
..............
Я получаю:
Время сбоя процесса истекло. Это может означать, что ваше решение недостаточно оптимизировано для обработки некоторых случаев.
Вот код, который мне удалось написать:
import math
import sys
def find_initial_position(maze, w, h):
for i in range(0, h):
for j in range(0,w):
if maze[i][j] == "O":
return [i, j]
return -1
def can_move(maze, direction, x, y):
if direction == "U":
if maze[ x -1 ][ y ] == "#":
return False
elif direction == "R":
if maze[ x ][ y + 1 ] == "#":
return False
elif direction == "D":
if maze[ x +1 ][ y ] == "#":
return False
elif direction == "L":
if maze[ x ][ y-1 ] == "#":
return False
return True
def turn_clockwise(direction):
directions = ["U", "R", "D", "L"]
return directions[ (directions.index(direction) + 1) % 4 ]
def move(direction, coordinates):
if direction == "U":
coordinates[0] -=1
elif direction == "R":
coordinates[1] +=1
elif direction == "D":
coordinates[0] +=1
elif direction == "L":
coordinates[1] -=1
def main():
w, h = [int(i) for i in input().split()]
n = int(input())
maze = []
direction = "U"
position = [0, 0]
for i in range(h):
line = input()
maze.append(line)
position = find_initial_position(maze, w, h)
for i in range(0, n):
while not can_move(maze, direction, position[0], position[1]):
direction = turn_clockwise(direction)
move(direction, position)
print( "%(x)d %(y)d" %{"x": position[1], "y": position[0]} )
main()