有没有办法在图形上加速我的 python 程序?

问题描述

给定矩阵 NxM。有 '。' - 您可以访问的单元格,以及 '#' - 您不能访问的单元格。你只能向上、向下、向右和向左(不是对角线)。同样给出 q 请求,在每个单元格中都有需要交换的行和列(如果单元格是“#”,则将其更改为“.”,反之亦然)。对于每个 q 请求,如果可以从单元格 (sx,sy) 到达单元格 (tx,ty),则打印“是”,如果不可能,则打印“否”。在任何请求下,(sx,sy) 和 (tx,ty) 都不是“#”。

在第一行给出 sx,sy,tx,ty,N,M,q (每个都是从 1 到 100)。在接下来的 N 行中给出一个带有 '.' 的矩阵是空单元格,'#' 是一堵墙。在这 N 行之后,有 q 行有请求。每个都是一对数字,描述 x 和 y 在矩阵中的位置进行交换。

输出中应该有 q 行,如果可以在行的 te 步骤从起点到目标点,则每行都有“是”,如果不可能,则为“否”。

示例: (输入)

1 1 2 3 3 3 2
.##
##.
###
1 2
2 2

输出

No
Yes

说明

第一次请求后矩阵是

..#
##.
###

在第二次请求之后,矩阵是

..#
#..
###

不幸的是,我没有更多的输入示例。但是,我必须通过网站上的所有未知测试。在那里我正确地解决了所有测试,除了我遇到时间限制错误的两个测试。也许你可以看到 hwo 来加速我的代码。顺便说一句,时间限制是0.5秒

我的代码在这里

sx,n,m,q = map(int,input().split())
arr = [[] for i in range(n)]
for i in range(n):
    line = input()
    arr[i] = [1 if j=='.' else 0 for j in line]
change = [[] for i in range(q)]
for i in range(q):
    change[i] = list(map(int,input().split()))

def is_path(sx,gr):
    visited = []
    path = False

    def dfs(px,py):
        global path
        if (px,py) == (tx,ty):
            return True
        visited.append([px,py])
        for dx in [1,-1]:
            if -1<py+dx<n and gr[px+dx][py] == 1 and [px+dx,py] not in visited:
                if dfs(px+dx,py):
                    return True
        for dy in [1,-1]:
            if -1<py+dy<m and gr[px][py+dy] == 1 and [px,py+dy] not in visited:
                if dfs(px,py+dy):
                    return True
        return False

    return dfs(sx,sy)

for i in range(q):
    arr[change[i][0]-1][change[i][1]-1] += 1
    arr[change[i][0] - 1][change[i][1] - 1] %= 2

    ans = is_path(sx-1,sy-1,tx-1,ty-1,arr)
    if ans: print('Yes')
    else: print('No')

解决方法

主要的算法效率低下是您使用“已访问”集合的列表,这导致网格大小的二次最坏情况复杂性。使用 set 会将其降低到线性时间。

除此之外,您还需要利用查询之间的一致性。例如,如果一个单元格被设置为可遍历,那么它不会破坏路径,如果一个单元格设置为不可遍历,那么它将永远不会创建一个路径。您还可以使用不相交的集合结构来观察包含开始和结束单元格的连接组件何时连接。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...