結果
問題 |
No.3121 Prime Dance
|
ユーザー |
|
提出日時 | 2025-04-19 20:06:50 |
言語 | Python3 (3.13.1 + numpy 2.2.1 + scipy 1.14.1) |
結果 |
WA
|
実行時間 | - |
コード長 | 2,426 bytes |
コンパイル時間 | 391 ms |
コンパイル使用メモリ | 12,672 KB |
実行使用メモリ | 10,880 KB |
最終ジャッジ日時 | 2025-04-19 20:06:53 |
合計ジャッジ時間 | 2,168 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge4 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 2 |
other | AC * 10 WA * 11 |
ソースコード
#!/usr/bin/env python3 import sys from collections import deque def solve(): input = sys.stdin.readline H, W = map(int, input().split()) Sx, Sy = map(int, input().split()) Gx, Gy = map(int, input().split()) # 0‑index Sx -= 1; Sy -= 1 Gx -= 1; Gy -= 1 grid = [list(input().rstrip()) for _ in range(H)] # 1) BFS for reachability & shortest-path parents dist = [[-1]*W for _ in range(H)] parent = {} dq = deque([(Sx, Sy)]) dist[Sx][Sy] = 0 dirs = [(1,0),(-1,0),(0,1),(0,-1)] while dq: x, y = dq.popleft() if (x,y) == (Gx,Gy): break for dx, dy in dirs: nx, ny = x+dx, y+dy if 0 <= nx < H and 0 <= ny < W \ and grid[nx][ny] != '#' and dist[nx][ny] < 0: dist[nx][ny] = dist[x][y] + 1 parent[(nx,ny)] = (x,y) dq.append((nx,ny)) if dist[Gx][Gy] < 0: print(-1) return # 2) Reconstruct *one* shortest path and count its directional moves path = [] cur = (Gx, Gy) while cur != (Sx, Sy): path.append(cur) cur = parent[cur] path.append((Sx, Sy)) path.reverse() A0 = B0 = C0 = D0 = 0 for (x1,y1), (x2,y2) in zip(path, path[1:]): if x2 == x1 + 1: A0 += 1 # down elif x2 == x1 - 1: B0 += 1 # up elif y2 == y1 + 1: C0 += 1 # right else: D0 += 1 # left base_len = A0 + B0 + C0 + D0 # 3) sieve primes up to ~2000 P_MAX = 2000 is_prime = [True]*(P_MAX+1) is_prime[0] = is_prime[1] = False for i in range(2, int(P_MAX**0.5)+1): if is_prime[i]: for j in range(i*i, P_MAX+1, i): is_prime[j] = False # 4) build x-list: want A0+x and B0+x both prime xs = [] for x in range(0, P_MAX+1 - max(A0,B0)): if is_prime[A0 + x] and is_prime[B0 + x]: xs.append(x) # 5) build y-list: want C0+y and D0+y both prime ys = [] for y in range(0, P_MAX+1 - max(C0,D0)): if is_prime[C0 + y] and is_prime[D0 + y]: ys.append(y) if not xs or not ys: print(-1) return # 6) take the best ans = None for x in xs: for y in ys: T = base_len + 2*x + 2*y if ans is None or T < ans: ans = T print(ans) if __name__ == "__main__": solve()