結果
問題 | No.323 yuki国 |
ユーザー |
|
提出日時 | 2015-12-17 00:22:00 |
言語 | Python3 (3.13.1 + numpy 2.2.1 + scipy 1.14.1) |
結果 |
AC
|
実行時間 | 49 ms / 5,000 ms |
コード長 | 2,868 bytes |
コンパイル時間 | 290 ms |
コンパイル使用メモリ | 13,056 KB |
実行使用メモリ | 11,136 KB |
最終ジャッジ日時 | 2024-06-28 12:24:04 |
合計ジャッジ時間 | 2,647 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge5 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 6 |
other | AC * 32 |
ソースコード
def read_data():H, W = map(int, input().split())A, Si, Sj = map(int, input().split())B, Gi, Gj = map(int, input().split())Ms = [[c == '*' for c in input()] for i in range(H)]return H, W, A, Si, Sj, B, Gi, Gj, Msdef solve(H, W, A, Si, Sj, B, Gi, Gj, Ms):if H == 1 and W == 1:return Falseif (A - B + (Si - Gi) + (Sj - Gj)) % 2:return Falselower = [[float('inf')] * W for h in range(H)]upper = [[-1] * W for h in range(H)]lower[Si][Sj] = Aupper[Si][Sj] = Afs = set([(Si, Sj)])while fs:nfs = set()for i, j in fs:m = Ms[i][j]min_snow = lower[i][j]max_snow = upper[i][j]for di, dj in [(-1, 0), (1, 0), (0, -1), (0, 1)]:ni = i + dinj = j + djif ni < 0 or ni >= H or nj < 0 or nj >= W:continueif update_status(m, min_snow, max_snow, ni, nj, upper, lower, Ms):nfs.add((ni, nj))if lower[Gi][Gj] <= B and upper[Gi][Gj] >= B:return Truefs = nfsreturn Falsedef update_status(m, min_snow, max_snow, ni, nj, upper, lower, Ms):n_m = Ms[ni][nj]if m != n_m:if n_m: # 移動元には雪がなく、移動先には雪がある場合。n_min_snow = min_snow + 1n_max_snow = max_snow + 1else: # 移動元には雪があり、移動先には雪がない場合。n_min_snow = min_snow - 1n_max_snow = max_snow - 1if min_snow == 1:if max_snow == 1:n_min_snow = float('inf')n_max_snow = -1else:n_min_snow = 2elif n_m: # 移動元と移動先の両方に雪がある場合。ここを何度も往復すれば、雪玉をいくらでも大きくできる。n_min_snow = min_snow + 1n_max_snow = float('inf')else: # 移動元と移動先の両方に雪がない場合。ここを何度も往復すれば、雪玉を 2 or 1 になるまで小さくできる。if min_snow == 1:if max_snow == 1:n_min_snow = float('inf')else:n_min_snow = 2elif min_snow % 2:n_min_snow = 2else:n_min_snow = 1n_max_snow = max_snow - 1if max_snow == 1:n_max_snow = -1changed = Falseif n_min_snow < lower[ni][nj]:lower[ni][nj] = n_min_snowchanged = Trueif n_max_snow > upper[ni][nj]:upper[ni][nj] = n_max_snowchanged = Truereturn changedH, W, A, Si, Sj, B, Gi, Gj, Ms = read_data()if solve(H, W, A, Si, Sj, B, Gi, Gj, Ms):print('Yes')else:print('No')