結果
| 問題 |
No.3121 Prime Dance
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2025-03-20 22:24:35 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
AC
|
| 実行時間 | 894 ms / 2,000 ms |
| コード長 | 2,249 bytes |
| コンパイル時間 | 366 ms |
| コンパイル使用メモリ | 82,776 KB |
| 実行使用メモリ | 183,484 KB |
| 最終ジャッジ日時 | 2025-04-08 23:39:21 |
| 合計ジャッジ時間 | 9,916 ms |
|
ジャッジサーバーID (参考情報) |
judge3 / judge4 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 23 |
ソースコード
from collections import deque
H, W = map(int, input().split())
Sx, Sy = map(int, input().split())
Gx, Gy = map(int, input().split())
Sx -= 1
Sy -= 1
Gx -= 1
Gy -= 1
C = [list(input()) for i in range(H)]
if Sx > Gx:
Sx = H-1-Sx
Gx = H-1-Gx
C.reverse()
if Sy > Gy:
Sy = W-1-Sy
Gy = W-1-Gy
for i in C:
i.reverse()
IINF = 10**8
def tup2idx(x, y, a, c):
return ((x*W+y)*H*W+a)*2+c
def idx2tup(n):
c = n & 1
n >>= 1
a = n % (H*W)
n //= H*W
y = n % W
x = n//W
return x, y, a, c
dist = [IINF] * (H*W*H*W*2)
dist[tup2idx(Sx, Sy, 0, 0)] = 0
q = deque([tup2idx(Sx, Sy, 0, 0)])
def can_move(x, y):
if x < 0 or x >= H or y < 0 or y >= W:
return False
return C[x][y] != '#'
while q:
v = q.popleft()
x, y, a, c = idx2tup(v)
d = dist[v]
# A
if a+1 < H*W:
x2, y2 = x-1, y
v2 = tup2idx(x2, y2, a+1, c)
if can_move(x2, y2) and dist[v2] > d:
dist[v2] = d
q.appendleft(v2)
# B
x2, y2 = x+1, y
v2 = tup2idx(x2, y2, a, c)
if can_move(x2, y2) and dist[v2] > d:
dist[v2] = d
q.appendleft(v2)
# C
x2, y2 = x, y-1
v2 = tup2idx(x2, y2, a, 1)
if can_move(x2, y2) and dist[v2] > d+1:
dist[v2] = d+1
q.append(v2)
# D
x2, y2 = x, y+1
v2 = tup2idx(x2, y2, a, c)
if can_move(x2, y2) and dist[v2] > d:
dist[v2] = d
q.appendleft(v2)
prime = [1] * (10**5)
prime[0] = 0
prime[1] = 0
for i in range(10**5):
if not prime[i]:
continue
for j in range(i*i, 10**5, i):
prime[j] = 0
pH = []
pW = []
for i in range(10**5-(Gx-Sx)):
if prime[i] and prime[i+(Gx-Sx)]:
pH.append(i)
for i in range(10**5-(Gy-Sy)):
if prime[i] and prime[i+(Gy-Sy)]:
pW.append(i)
ans = IINF
def lb(L, x):
l, ge = -1, len(L)
while ge-l > 1:
mid = (ge+l) >> 1
if L[mid] >= x:
ge = mid
else:
l = mid
return ge
for i in range(1, H*W):
ch = lb(pH, i)
cw = lb(pW, dist[tup2idx(Gx, Gy, i, 1)])
if ch < len(pH) and cw < len(pW):
ans = min(ans, pH[ch]*2+(Gx-Sx) + pW[cw]*2+(Gy-Sy))
if ans == IINF:
print(-1)
else:
print(ans)