Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x 编码名称';一个孩子';s play';进程超时_Python 3.x - Fatal编程技术网

Python 3.x 编码名称';一个孩子';s play';进程超时

Python 3.x 编码名称';一个孩子';s play';进程超时,python-3.x,Python 3.x,我正试图解决使用python的编码难题。 使用我的程序,我可以通过前两个测试用例,但当测试需要大量循环时,我的程序会超时。我可以改进什么 要完全理解这个问题,需要挑战的细节,但我不想复制并粘贴到这里,因为我不确定这是允许的 我试着用我的话来解释这个问题。鉴于这一投入: 12 6 987 ...#........ ...........# ............ ............ ..#O........ ..........#. O是字符的起点 #是你不能踩的墙吗 是角色可以步进的

我正试图解决使用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()

我简化了您的代码,并通过以下方式使其更具可读性:

  • 利用矩阵乘法与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()