import sys, math
from collections import deque
def solve():
data = sys.stdin.buffer.read().split()
if not data:
return
it = iter(data)
n = int(next(it)); m = int(next(it))
x = int(next(it)) - 1
y = int(next(it)) - 1
arr = [next(it).decode() for _ in range(n)]
dirs = [(-1, 0), (1, 0), (0, 1), (0, -1)]
dist_solo = [[-1]*m for _ in range(n)]
stk = []
for i in range(n):
for j in range(m):
if arr[i][j] == '@':
stk.append(m*i+j)
dist_solo[i][j] = 0
q = deque(stk)
while q:
for _ in range(len(q)):
sta = q.popleft()
i, j = sta // m, sta % m
for di, dj in dirs:
ni, nj = i + di, j + dj
if 0<=ni<n and 0<=nj<m and arr[ni][nj]=='.' and dist_solo[ni][nj]==-1:
dist_solo[ni][nj] = dist_solo[i][j] + 1
q.append(m*ni+nj)
dist = [[-1]*m for _ in range(n)]
dist[x][y] = 0
q = deque()
q.append(m*x+y)
ans = math.inf
while q:
sta = q.popleft()
i, j = sta // m, sta % m
if dist[i][j] >= ans:break
oi, oj = 2*x-i, 2*y-j
for di, dj in dirs:
ni, nj = i + di, j + dj
noi, noj = oi - di, oj - dj
if 0 <=ni<n and 0<=nj<m and 0<=noi<n and 0<=noj<m and \
arr[ni][nj] != '#' and arr[noi][noj] != '#' and \
dist[ni][nj] == -1:
dist[ni][nj] = dist[i][j] + 1
if arr[ni][nj] == '@' and arr[noi][noj] == '@':
ans = min(ans, dist[i][j]+1)
elif arr[ni][nj] == '@':
ans = min(ans, dist[i][j]+1+dist_solo[noi][noj])
elif arr[noi][noj] == '@':
ans = min(ans, dist[i][j]+1+dist_solo[ni][nj])
else:
q.append(m*ni+nj)
print(ans if ans != math.inf else -1)
if __name__ == '__main__':
solve()
py没过的兄弟萌,看看是不是输入的问题,我试了两个小时各种优化都不行,最后发现修改下输入数据的接收方法就能卡时间过了,再优化下剪枝应该还能更快,别用input()和sys.stdin.readline(),很有可能就是逐行输入卡TLE了

京公网安备 11010502036488号