【競プロ】1日1AC : ABC75 B問題

今日の問題はこちら。

Difficultyは340(灰)です。
AtCoder Problemsより)

次の記事の問題が同様にして解けます。ここの問題が解けたら是非こっちにも解いてみてください。

【競プロ】1日1AC : ABC96 C問題

2020年3月30日

提出コードと考え方

あるマスの周り8カ所を調べます。特殊なことはあまりしてないので先に提出コードを載せます。

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

const int dx[8] = {1,1,0,-1,-1,-1,0,1};
const int dy[8] = {0,1,1,1,0,-1,-1,-1};

int main(){
    int h,w;
    cin >> h >> w;
    // 入力されるマップの外側を'.'で埋めておく
    vector<vector<char>> data(h+2,vector<char>(w+2,'.'));
    for(int i = 1;i <= h;i++){
        for(int j = 1;j <= w;j++){
            cin >> data[i][j];
        }
    }

    for(int i = 1;i <= h;i++){
        for(int j = 1;j <= w;j++){
            int cnt = 0;
            if(data[i][j] == '#') cout << '#';
            else{
                // 周り8マスを調べる
                for(int k = 0;k < 8;k++){
                    if(data[i+dx[k]][j+dy[k]] == '#') cnt++;
                }
                cout << cnt;
            }
        }
        cout << endl;
    }
    return 0;
}

マップ端のマスだと周囲8箇所のうち調べられないところが出てくるので、continueなどで飛ばすか、このように予めマップの外に空きマスを置くといいと思います。

周囲のマスを調べるときに8つの処理を列挙する必要は無くて、予め \( (dx,dy)\) の組を用意してそれをインデックスに加えることで実装できます。

終わりに

B問題の割には難しめという印象です。(自分が弱いだけか??)
もっと色々な問題パターンに対応できるように頑張りたいです。

コメント