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的密室逃脱游戏主题排行榜