グリッドの各マスについて周囲を調べる方法

Rustにおいてグリッドのあるマス(i, j)に対して、その周辺を調べるときに境界条件の取り扱いが面倒である。そこで便利な関数を利用してこの周囲の探索を簡単に書く方法に関してまとめる。

方法

// 大きさ(h, w)のグリッドの
// マス(x, y)に関してその上下左右斜めのマスを全探索する
for &(dx, dy) in [(0, 1), (0, !0), (1, 0), (!0, 0), (1, 1), (!0, 1), (1, !0), (!0, !0)].iter() {
    let x = x.wrapping_add(dx);
    let y = y.wrapping_add(dy);
    if x < h && y < w {
        // (x, y)にしたい処理
        // ここで(x, y)とは周辺のマスのことである
        }
}

このとき、 x.wrapping_add(!0)はx=0のときにそのbitで表すことができる最大値、x>0のときはx-1を表す。a.wrapping_add(b)はa+bの中で溢れたbitを切り捨てる。

これによって本来ならi,jの状況に対して場合わけをしなければならないところを一つの文で書くことができて、便利である。