Official
B - Count Adjacent Cells Editorial
by
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:
