上下左右の探索

ちょっと他人のコードを読んでいてなるほどと思ったからメモ。
これで少しハードコーダーを脱せるかもしれない。

2次元の探索問題でよく自分の上下左右を探索したい時がある。これを普通にコーディングするとどっかで下のような感じになっているはずだ。

dfs(x-1,y);
dfs(x+1,y);
dfs(x,y-1);
dfs(x,y+1);

これがちょっと恥ずかしい時は

for (int dy = -1; dy <= 1; dy++)
  for (int dx = -1; dx <= 1; dx++)
    if (dx != 0 ^ dy != 0)
      dfs(x+dx, y+dy);

とすればよいらしい。
ちなみに^を|に変えると、4連結を8連結に変えて探索できる。


ま、最初のほうが書くの楽じゃんって話はあるけど・・・。