今日の問題はこちら。
Difficultyは340(灰)です。
(AtCoder Problemsより)
次の記事の問題が同様にして解けます。ここの問題が解けたら是非こっちにも解いてみてください。
提出コードと考え方
あるマスの周り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問題の割には難しめという印象です。(自分が弱いだけか??)
もっと色々な問題パターンに対応できるように頑張りたいです。
コメント