13.2 邊界判斷:inside 函式
地圖題的每一步幾乎都會問同一個問題:這個座標還在地圖裡嗎?答案就是四個比較:
0 \le r < H \quad\text{且}\quad 0 \le c < W
寫成判斷函式(上冊 7.4),之後每一題都直接抄:
int H, W; // 地圖大小(全域,讓 inside 看得到)
bool inside(int r, int c) {
return 0 <= r && r < H && 0 <= c && c < W;
}
¶為什麼一定要判
沒判邊界就去讀 grid[r][c],r 或 c 一超出範圍就是存取陣列外的記憶體——上冊 6.8 講過的未定義行為。它可能剛好沒事、可能讀到垃圾值、也可能整個程式當掉;最麻煩的是「範例過了、交上去 RE」,因為出界的情況只有大測資才碰得到。
¶「四周視為牆」與「出界留原地」
題目常會用兩種說法處理邊界,讀到就知道怎麼寫:
- 「場地四周視為被牆壁包圍」(蒐集寶石)——出界和撞牆是同一件事,判斷寫成
!inside(nr, nc) || a[nr][nc] == -1。 - 「會離開範圍的那一步就留在原地」(蜜蜂觀察)——先算出下一格,
inside成立才把位置更新過去,否則什麼都不做。
還有一種是題目直接送你的方便:「最外圈保證是牆」——那麼從裡面出發永遠走不出去,連 inside 都可以省。範圍裡每一條保證都值得看,少看一條就多寫一個沒必要的判斷,或漏一個必要的。