けんちょんの競プロ精進記録

競プロの精進記録や小ネタを書いていきます

AtCoder ABC 250 A - Adjacent Squares (6Q, 灰色, 100 点)

グリッド上の問題を考えるときには、いつも大事になる処理!

問題概要

 H \times W のグリッドがある。上から  R 行目、左から  C 列目のマスを考える。

このマスに辺で隣接するマスの個数を求めよ。

制約

  •  1 \le R \le H \le 10
  •  1 \le C \le W \le 10

考えたこと

ここでは 0-indexed で考える。つまり、一番上の行は 0 行目であるとして、一番左の列は 0 列目であるとする。このとき、左上のマスは (0, 0) であり、右下のマスは  (H-1, W-1) となる。0-indexed で考えるためには、 R, C をあらかじめデクリメントしておけばよい。

さて、グリッドのマス  (R, C) に上下左右に隣接するマスにアクセスする処理は今後非常によく登場する! 下図を参考に、

  • マス  (R, C) の上のマス: (R - 1, C)
  • マス  (R, C) の下のマス: (R + 1, C)
  • マス  (R, C) の左のマス: (R, C - 1)
  • マス  (R, C) の左のマス: (R, C + 1)

となることに注意しよう。

これらのマスが、グリッドの場外にはみ出してしまうかどうかを判定し、はみ出さないものをカウントすればよいだろう。

コード

#include <bits/stdc++.h>
using namespace std;

int main() {
    int H, W, R, C, res = 0;
    cin >> H >> W >> R >> C;
    --R, --C;  // 0-indexed にする

    // 上のマスが場内か
    if (R - 1 >= 0) ++res;

    // 下のマスが場内か
    if (R + 1 < H) ++res;

    // 左のマスが場内か
    if (C - 1 >= 0) ++res;

    // 右のマスが場内か
    if (C + 1 < W) ++res;

    cout << res << endl;
}