Official

B - Count Adjacent Cells Editorial by sheyasutaka


解法 1

マス \((i, j)\) に辺で隣接するマスの座標は,以下の \(4\) 通りです.

  • マス \((i-1,\ j)\)
  • マス \((i+1,\ j)\)
  • マス \((i,\ j-1)\)
  • マス \((i,\ j+1)\)

上の座標にマスが存在するかを判定し,存在するマスの個数を求めればよいです.

解法 2

グリッドのサイズが \(1 \times 1\) の場合,マス \((1,1)\) の答えは \(0\) です.

グリッドのサイズが \(1 \times W\) (\(W > 1\)) の場合,マス \((1,1), (1,W)\) の答えは \(1\),それ以外のマスの答えは \(2\) です.

グリッドのサイズが \(H \times 1\) (\(H > 1\)) の場合,マス \((1,1), (H,1)\) の答えは \(1\),それ以外のマスの答えは \(2\) です.

グリッドのサイズが \(H \times W\) (\(H,W > 1\)) の場合,以下の通りです.

  • マス \((1,1), (1,W), (H,1), (H,W)\) の答えは \(2\)
  • 上に当てはまらないマスのうち,\(1\) 行目,\(H\) 行目,\(1\) 列目,\(W\) 列目のいずれかに属するマスの答えは \(3\)
  • 上のどちらでもないマスの答えは \(4\)

以上の場合分けをミス無く実装できれば正解です.

実装例 (C++, 解法 1)

#include <iostream>
using std::cin;
using std::cout;

int main (void) {
	int h, w;
	cin >> h >> w;

	int ans[h][w];
	for (int i = 0; i < h; i++) {
		for (int j = 0; j < w; j++) {
			ans[i][j] = 0;

			if (i-1 >= 0) ans[i][j]++;
			if (i+1 <  h) ans[i][j]++;
			if (j-1 >= 0) ans[i][j]++;
			if (j+1 <  w) ans[i][j]++;
		}
	}

	for (int i = 0; i < h; i++) {
		for (int j = 0; j < w; j++) {
			if (j > 0) { cout << " "; }
			cout << ans[i][j];
		}
		cout << "\n";
	}

	return 0;
}

posted:
last update: