解题思路: 本题是一道基础的搜索问题。为了使得时间最短,我们使用 BFS 算法,从起点开始向外逐层搜索,当搜到终点时,就结束搜索,并输出结果。 我们可以把每个点看做一个节点,每个节点有上下左右四个方向,可以到达的点就是空地和符合当前时间的石头。在搜索过程中,每个节点的初始距离赋值为 $0$,并将其加入队列中。然后依次取出队列中的节点,对其四周进行扩展,如果扩展出来的节点是空地或者当前时间可以通过石头到达,则将该节点加入队列中,并且将步数加一。特别地,如果扩展出来的是终点,那么直接返回当前步数即可。 需要注意的是,每次消失石头的时间间隔为 $K$ 的倍数,比如 $K=3$,则石头消失的时间为第 $3,6,9,\cdots$ 秒,因此要在 BFS 中加入时间的判断。 代码实现:
时间: 2023-07-14 11:14:20 浏览: 123
以下是 Python 代码实现:
```python
from queue import Queue
n, m, k = map(int, input().split())
maze = []
for i in range(n):
maze.append(input())
start = (0, 0, 0) # 起点坐标和当前时间
end = (n-1, m-1) # 终点坐标
dx = [0, 0, 1, -1] # 上下左右四个方向
dy = [1, -1, 0, 0]
q = Queue()
q.put(start)
while not q.empty():
cur_x, cur_y, cur_time = q.get()
if cur_x == end[0] and cur_y == end[1]: # 到达终点
print(cur_time)
break
for i in range(4): # 对当前节点的上下左右四个方向进行扩展
new_x = cur_x + dx[i]
new_y = cur_y + dy[i]
if new_x < 0 or new_x >= n or new_y < 0 or new_y >= m: # 超出边界
continue
if maze[new_x][new_y] == '#': # 遇到障碍物
if cur_time % k == k-1: # 时间到了,石头消失
continue
else: # 时间还没到,可以通过石头
q.put((new_x, new_y, cur_time+1))
else: # 遇到空地
q.put((new_x, new_y, cur_time+1))
```
时间复杂度为 $O(nm)$,其中 $n$ 和 $m$ 分别是迷宫的行数和列数。
阅读全文