結果
問題 |
No.3121 Prime Dance
|
ユーザー |
|
提出日時 | 2025-04-19 20:22:19 |
言語 | Python3 (3.13.1 + numpy 2.2.1 + scipy 1.14.1) |
結果 |
WA
|
実行時間 | - |
コード長 | 3,167 bytes |
コンパイル時間 | 382 ms |
コンパイル使用メモリ | 12,416 KB |
実行使用メモリ | 10,880 KB |
最終ジャッジ日時 | 2025-04-19 20:22:22 |
合計ジャッジ時間 | 2,107 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge2 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 2 |
other | AC * 14 WA * 7 |
ソースコード
from collections import deque import sys input = sys.stdin.readline # 1) Sieve primes up to n def sieve(n): is_prime = [True]*(n+1) if n >= 0: is_prime[0] = False if n >= 1: is_prime[1] = False for i in range(2, int(n**0.5)+1): if is_prime[i]: for j in range(i*i, n+1, i): is_prime[j] = False return is_prime def solve(): 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 grid = [input().rstrip() for _ in range(H)] # Directions: 0=down,1=up,2=right,3=left DIRS = [(1,0),(-1,0),(0,1),(0,-1)] # 2) BFS from S to build a shortest‐path tree AND record the full reachable component q = deque() q.append((Sx, Sy)) visited = [[False]*W for _ in range(H)] visited[Sx][Sy] = True parent = {} # (x,y) -> ((px,py), dir_idx) while q: x, y = q.popleft() for d,(dx,dy) in enumerate(DIRS): nx, ny = x+dx, y+dy if 0 <= nx < H and 0 <= ny < W and not visited[nx][ny] and grid[nx][ny] != '#': visited[nx][ny] = True parent[(nx,ny)] = ((x,y), d) q.append((nx,ny)) # If G not reachable at all if not visited[Gx][Gy]: print(-1) return # 3) Reconstruct one shortest path S -> G path_dirs = [] cur = (Gx, Gy) while cur != (Sx, Sy): (px,py), d = parent[cur] path_dirs.append(d) cur = (px,py) path_dirs.reverse() # 4) Count base‐path moves A0 = path_dirs.count(0) # down B0 = path_dirs.count(1) # up C0 = path_dirs.count(2) # right D0 = path_dirs.count(3) # left base_len = len(path_dirs) # 5) Check if we can insert vertical or horizontal 2‐step loops vert_ok = False horz_ok = False for x in range(H): for y in range(W): if visited[x][y]: if x+1 < H and visited[x+1][y]: vert_ok = True if y+1 < W and visited[x][y+1]: horz_ok = True if vert_ok and horz_ok: break if vert_ok and horz_ok: break # 6) Sieve primes up to (base_len + 2000) LIMIT = base_len + 2000 is_prime = sieve(LIMIT) # 7) Find minimal x≥0 so that A0+x and B0+x are both prime (if loops allowed) def find_shift(c0, d0, can_loop): # if no loops allowed, only x=0 if not can_loop: return 0 if (c0 <= LIMIT and d0 <= LIMIT and is_prime[c0] and is_prime[d0]) else None # otherwise scan x=0,1,2,... for x in range(0, LIMIT+1): cc = c0 + x dd = d0 + x if cc <= LIMIT and dd <= LIMIT and is_prime[cc] and is_prime[dd]: return x return None x = find_shift(A0, B0, vert_ok) if x is None: print(-1) return y = find_shift(C0, D0, horz_ok) if y is None: print(-1) return # 8) Total moves = base_len + 2*(x + y) ans = base_len + 2*(x + y) print(ans) if __name__ == "__main__": solve()