2020 CCC J5/Q2密室逃脱(Python)BFS优化

Posted

技术标签:

【中文标题】2020 CCC J5/Q2密室逃脱(Python)BFS优化【英文标题】:2020 CCC J5/Q2 Escape Room (Python) BFS Optimization 【发布时间】:2021-01-23 05:02:43 【问题描述】:

有没有办法进一步优化我的代码? 我正在努力解决 2020 CCC J5/Q2 的问题,我已经通过了所有测试用例,除了一些超出时间限制的测试用例。

链接到问题(这是最后一个问题) https://cemc.uwaterloo.ca/contests/computing/2020/ccc/juniorEF.pdf

#definitions
row = int(input())
column = int(input())
array = [list(map(int, input().split())) for x in range(row)]
area = row*column

#Setting the queue to only have -1
pathways = [-1]*(area+1)
emptyS = 0
currentPath = 0
inList = [False] * 1000001

#Setting the first number in the queue to equal the number at [0][0]
pathways[emptyS] = array[0][0]
emptyS += 1`enter code here`
#Checking if the number at [0][0] is the answer (the answer is the area of the array)
if pathways[currentPath] == area:
    print('yes')
    raise SystemExit(0)

#Using BFS to find the answer
#Looping until the queue hits -1
while pathways[currentPath] != -1:
    for x in range(1, row+1):
        if pathways[currentPath] % x == 0:
            for y in range(1, column+1):

#I wasn't sure how to add 1 to every index of my 2d array, so I added 1 in the for loop, and arrayMN is the actual index in my loop.
                arrayMN = array[x-1][y-1]
                if pathways[currentPath] == x*y:

                    #Checking if the value is equal to the answer
                    if arrayMN == area:
                        print("yes")
                        raise SystemExit(0)

                    #If it isn't equal, either replace the -1 in pathways with the number (add it to the queue) or don't add it to prevent a loop)
                    if inList[arrayMN] == False:
                        pathways[emptyS] = arrayMN
                        emptyS += 1
                        inList[arrayMN] = True
    currentPath += 1

#If none of the above works, it is not possible
print('no')

这是我的第一个论坛帖子,所以如果我可以做任何事情来改进我的帖子,请告诉我。

【问题讨论】:

【参考方案1】:

是的。以下是我对自己的代码所做的更改,这些更改最初遵循与您类似的算法,最终让所有测试在时限内通过。

y 的内部循环不是必需的,因为一旦您知道路径[currentPath] 可以被 x 整除,y 位置就已经知道了。您可以通过:y = pathways[currentPath] // x 获取值,并且需要检查不超过您拥有的列数:y <= column,然后再使用它来计算 arrayMN

通过将array 转换为单元格值字典,不需要内部for x 循环:行* 出现值对的列。当您第一次获得输入时,检查每个值是否在字典中。如果不是,则添加一个包含其行 * 列值的集合。如果是,只需将行 * 列值添加到现有集合中。现在您可以向后工作:从退出单元格值开始,将字典中的相应值添加到您的队列中,然后重复直到队列为空(无转义)或您在队列中找到 1(转义)。

另外,考虑使用集合库中的deque 代替pathways 列表作为队列,并使用集合代替inList 来跟踪单元格值。与您的代码不同,我最初用于队列的列表的长度发生了变化,Python 文档清楚地表明 deque 会更快:

https://docs.python.org/3/library/collections.html#collections.deque

【讨论】:

使用段落格式化文本会使您的答案更具可读性。

以上是关于2020 CCC J5/Q2密室逃脱(Python)BFS优化的主要内容,如果未能解决你的问题,请参考以下文章

基于Spring MVC + Spring + MyBatis的密室逃脱游戏主题排行榜

基于Spring MVC + Spring + MyBatis的密室逃脱游戏主题排行榜

模块化运营,会是媒体行业“密室逃脱”的一线生机么?

密室逃脱向左,剧本杀向右,狼人杀踟蹰不前

暑假都有哪些精彩的活动

bzoj4446[Scoi2015]小凸玩密室