作者:王一哲
日期:2025年9月7日
ZeroJudge 題目連結:
d626. 小畫家真好用
解題想法
用 BFS 及四方位檢查解題,由於我比較懶得檢查邊界值,我會在周圍加上 + 當作哨兵避免出界。
Python 程式碼
使用時間約為 24 ms,記憶體約為 3.5 MB,通過測試。
n = int(input()) # 地圖 n*n
grid = [list(input().strip()) + ["+"] for _ in range(n)] # 讀取地圖資料,最右側加上 + 作為哨兵
grid.append(list("+"*(n+1))) # 最下方加 n+1 個 + 作為哨兵
que = [tuple(map(int, input().split()))] # 待走訪佇列,先放入起點
head = 0 # 從 que 讀取資料用的索引值
while head < len(que): # BFS,當 head 還沒有出界繼續執行
r, c = que[head]; head += 1 # 從 que 讀取要走訪的點 (r, c),head 加 1
for dr, dc in ((0, 1), (1, 0), (0, -1), (-1, 0)): # 四方位檢查
nr, nc = r+dr, c+dc # 要檢查的點 (nr, nc)
if grid[nr][nc] == "+": continue # 如果 grid[nr][nc] 是 +,找下一個點
grid[nr][nc] = "+" # grid[nr][nc] 改成 +
que.append((nr, nc)) # (nr, nc) 加入 que
for i in range(n): print("".join(grid[i][:n])) # 依序讀取 grid[:n][:n],接成字串再輸出
改用 deque 儲存待走訪節點,使用時間約為 25 ms,記憶體約為 3.7 MB,通過測試。
from collections import deque
n = int(input()) # 地圖 n*n
grid = [list(input().strip()) + ["+"] for _ in range(n)] # 讀取地圖資料,最右側加上 + 作為哨兵
grid.append(list("+"*(n+1))) # 最下方加 n+1 個 + 作為哨兵
que = deque([tuple(map(int, input().split()))]) # 待走訪佇列,先放入起點
while que: # BFS,當 que 還有資料繼續執行
r, c = que.popleft() # 從 que 開頭讀取並移除要走訪的點 (r, c)
for dr, dc in ((0, 1), (1, 0), (0, -1), (-1, 0)): # 四方位檢查
nr, nc = r+dr, c+dc # 要檢查的點 (nr, nc)
if grid[nr][nc] == "+": continue # 如果 grid[nr][nc] 是 +,找下一個點
grid[nr][nc] = "+" # grid[nr][nc] 改成 +
que.append((nr, nc)) # (nr, nc) 加入 que
for i in range(n): print("".join(grid[i][:n])) # 依序讀取 grid[:n][:n],接成字串再輸出