語法書 / AA 競程語法書 下冊 / 第十三單元 / 邊界判斷:inside 函式

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]rc 一超出範圍就是存取陣列外的記憶體——上冊 6.8 講過的未定義行為。它可能剛好沒事、可能讀到垃圾值、也可能整個程式當掉;最麻煩的是「範例過了、交上去 RE」,因為出界的情況只有大測資才碰得到。

「四周視為牆」與「出界留原地」

題目常會用兩種說法處理邊界,讀到就知道怎麼寫:

  • 「場地四周視為被牆壁包圍」(蒐集寶石)——出界和撞牆是同一件事,判斷寫成 !inside(nr, nc) || a[nr][nc] == -1
  • 「會離開範圍的那一步就留在原地」(蜜蜂觀察)——先算出下一格,inside 成立才把位置更新過去,否則什麼都不做。

還有一種是題目直接送你的方便:「最外圈保證是牆」——那麼從裡面出發永遠走不出去,連 inside 都可以省。範圍裡每一條保證都值得看,少看一條就多寫一個沒必要的判斷,或漏一個必要的。