【競プロC++ブログ】AtCoder Beginner Contest458-B問題を解いてみた!
本日の動画
ここ最近はYouTubeにAtCoderの解説動画を投稿しているので、ぜひ文章ベースじゃなくて、動画がいい方は確認してみてください!
AtCoder ABC458 B問題
問題文を簡単に要約すると整数H(行),W(列)が与えられて、それをグリッドで表示をします。
そのグリッド表示されたマス目の各マスには数字を書くのですが、その数字は隣接している個数を書きます。
例をあげると2-4の場合は
2332
2332
になります。
一番左上が右と下の径二つ隣接しているので2、その隣の3は左右と下の計三つなので3になります。
実際にコードを書いてみた!
オラは競技プログラミングやる時はC++でやるのでよろしくであるよ!
#include <bits/stdc++.h>
using namespace std;
int main() {
int H, W;
cin >> H >> W;
for (int i = 0; i < H; i++) {
for (int j = 0; j < W; j++) {
int cnt = 0;
// up
if (i > 0) cnt++;
// down
if (i < H - 1) cnt++;
// left
if (j > 0) cnt++;
// right
if (j < W - 1) cnt++;
cout << cnt;
if(j != w-1) cout << " ":
}
cout << endl;
}
return 0;コードを解説するとグリッドの書き方はfor文の二重ループを使います。
調べたところ英語ではnested loopなどと呼ばれているらしいです。
行のHが外とループで、列のWが内ループになります。
次に隣接の書き方はif文で判断しました。
上の場合の判別は行の一番上が0なので、0の場合は上に隣接しているマスがないのでカウントしない、そして、それ以上の場合は上にマスがあるのでカウントします。
そのような感じで一番端っこを基準に判別式を考えることによって、簡単に判断基準を考えることができます。
最後に注意することがあるのですが、列との間には半角スペースがある点です。
なのでfor文のw列の最後には”半角スペース”を出力する必要があります。
まとめ
競技プログラミングでは出力が正解になれば、どんなコードでも構いません。
自分も最初はif(j != w-1) cout << ” “:と書いていたのですが、ここはそのままcout << ” “;で判別式なしにスペースを書いてもいいことに最後気づきました。
列の最後はスペースを出力しても、結局行の移行で改行のendlを挟むので結果としては変わらない。
このような点が競プロの楽しみだと思いました。

