Python 3.x 编码名称';一个孩子';s play';进程超时
我正试图解决使用python的编码难题。 使用我的程序,我可以通过前两个测试用例,但当测试需要大量循环时,我的程序会超时。我可以改进什么 要完全理解这个问题,需要挑战的细节,但我不想复制并粘贴到这里,因为我不确定这是允许的 我试着用我的话来解释这个问题。鉴于这一投入:Python 3.x 编码名称';一个孩子';s play';进程超时,python-3.x,Python 3.x,我正试图解决使用python的编码难题。 使用我的程序,我可以通过前两个测试用例,但当测试需要大量循环时,我的程序会超时。我可以改进什么 要完全理解这个问题,需要挑战的细节,但我不想复制并粘贴到这里,因为我不确定这是允许的 我试着用我的话来解释这个问题。鉴于这一投入: 12 6 987 ...#........ ...........# ............ ............ ..#O........ ..........#. O是字符的起点 #是你不能踩的墙吗 是角色可以步进的
12 6
987
...#........
...........#
............
............
..#O........
..........#.
是字符的起点O
是你不能踩的墙吗#
是角色可以步进的地方
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()
我简化了您的代码,并通过以下方式使其更具可读性:
- 利用矩阵乘法与numpy进行90°顺时针旋转李>
- 使用内置的
查找初始位置李>str.index()
障碍物之间以矩形模式循环弹跳(也可能是更复杂的模式)。因此,通过你的方法,你在计算和重新计算相同的短动作序列,数百万次和数十亿次;即使最长的循环也不可能有比你的小迷宫中的方块数(数量级)更多的移动
你应该尝试做的是连续记录到目前为止所做的所有动作(位置、方向)。如果——或者更确切地说,是在什么时候——你到达了一个(位置、方向)你以前去过的地方,那么你已经完成了一个完整的周期。不需要计算更多的移动。假设循环序列的长度为L,规定的移动总数为n,那么最终位置将是序列元素数ln(或类似的,尽管有一个错误)
在input().split()]中,行
w,h=[int(i)代表i]应该做什么?它看起来像是要将一个值解压为两个变量,但赋值的右侧只有一个值(尽管是list类型)。尝试运行时,只会导致ValueError
。请进行更改。您需要确定代码的哪一部分速度慢,并将重点放在这一点上。您还需要包括导致问题的输入。嗨@EtienneOtt。我修改了描述,试图更加详尽。如果有用的话,我在描述中留下了可供Codingame用户使用的挑战。可以只复制和粘贴代码,并使用平台提供的输入运行它。
import sys
import numpy as np
def is_obstacle(maze, position):
return maze[position[0]][position[1]] == '#'
def main():
w, h = [int(i) for i in input().split()]
n = int(input())
# Load maze
maze = []
for i in range(h):
line = input()
maze.append(line)
if 'O' in line:
# Found initial position
position = np.array([i, line.index('O')])
# Initial direction
direction = np.array([-1,0])
# Define actions
turn_clockwise = np.array([[0,-1],[1,0]])
# Walk maze
for i in range(n):
while is_obstacle(maze, position + direction):
direction = direction @ turn_clockwise
position = position + direction
print( "%(x)d %(y)d" %{"x": position[1], "y": position[0]} )
main()