結果
| 問題 |
No.2412 YOU Grow Bigger!
|
| コンテスト | |
| ユーザー |
lam6er
|
| 提出日時 | 2025-03-31 17:44:03 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
AC
|
| 実行時間 | 3,089 ms / 6,000 ms |
| コード長 | 3,034 bytes |
| コンパイル時間 | 146 ms |
| コンパイル使用メモリ | 82,360 KB |
| 実行使用メモリ | 97,076 KB |
| 最終ジャッジ日時 | 2025-03-31 17:45:26 |
| 合計ジャッジ時間 | 23,819 ms |
|
ジャッジサーバーID (参考情報) |
judge5 / judge4 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 2 |
| other | AC * 29 |
ソースコード
import sys
from collections import deque
def main():
H, W = map(int, sys.stdin.readline().split())
grid = []
for _ in range(H):
grid.append(list(sys.stdin.readline().strip()))
start = (0, 0) # (i, j) of top-left of 3x3 block. So area is (i, j, i+2, j+2)
end = (H-3, W-3)
# Precompute original spikes and allowed cells
# Start region: rows 0-2, cols 0-2 (assuming 0-based)
# End region: rows H-3 to H-1, cols W-3 to W-1 (0-based)
def is_start_region(r, c):
return r < 3 and c < 3
def is_end_region(r, c):
return r >= H-3 and c >= W-3
allowed_cells = []
for r in range(H):
for c in range(W):
if grid[r][c] == '.' and not is_start_region(r, c) and not is_end_region(r, c):
allowed_cells.append((r, c))
# Check if a position (i, j) (top-left) is valid given blocked_cell (block_r, block_c)
# blocked_cell is None or a tuple (r, c). Returns True if the position is valid.
def is_position_valid(i, j, blocked_cell=None):
# Check if the 3x3 block is within the grid
if i < 0 or j < 0 or i + 2 >= H or j + 2 >= W:
return False
# Check each cell in the 3x3 block
for dx in range(3):
for dy in range(3):
r = i + dx
c = j + dy
if grid[r][c] == '#':
return False
if blocked_cell is not None and (r == blocked_cell[0] and c == blocked_cell[1]):
return False
return True
# BFS to check if there's a path from start to end, given a blocked cell (optional)
def has_path(blocked_cell=None):
visited = [[False for _ in range(W-2)] for _ in range(H-2)] # positions are (H-2)*(W-2) possible
q = deque()
start_i, start_j = start
if not is_position_valid(start_i, start_j, blocked_cell):
return False
visited[start_i][start_j] = True
q.append((start_i, start_j))
end_i, end_j = end
while q:
i, j = q.popleft()
if (i, j) == (end_i, end_j):
return True
# Generate all possible moves
for di in [-1, 0, 1]:
for dj in [-1, 0, 1]:
if di == 0 and dj == 0:
continue
ni = i + di
nj = j + dj
if 0 <= ni < (H-2) and 0 <= nj < (W-2):
if not visited[ni][nj] and is_position_valid(ni, nj, blocked_cell):
visited[ni][nj] = True
q.append((ni, nj))
return False
# Check original grid
original_has_path = has_path()
if not original_has_path:
print(0)
return
# Check all allowed cells
for (r, c) in allowed_cells:
if not has_path((r, c)):
print(1)
return
# Otherwise, output 2 (assumption)
print(2)
if __name__ == '__main__':
main()
lam6er