2014年第5問です。
公式解説
#include <iostream>
#include <queue>
using namespace std;
int H, W;
char field[1005][1005];
queue<pair<int, int>> Q[2];
pair<int, int> i_j(0, 0);
int check(int i, int j) {
if (field[i][j] == '.') return 0;
int sarachi_count = 0;
for (int p = 0; p < 3; p++) {
for (int q = 0; q < 3; q++) {
if (field[i - 1 + p][j - 1 + q] == '.') { sarachi_count++; }
}
}
int field_data = atoi(&field[i][j]);
if (sarachi_count >= field_data) return 1; // 崩れる
return 0; // 崩れない
}
int main() {
cin.tie(0);
ios::sync_with_stdio(false);
cin >> H >> W;
for (int i = 0; i < H; i++) {
for (int j = 0; j < W; j++) {
cin >> field[i][j];
}
}
int wave_count = 0;
// 最初の全チェック
for (int i = 0; i < H; i++) {
for (int j = 0; j < W; j++) {
int res = check(i, j);
switch (res) {
case 0:
break;
case 1:
Q[0].push(make_pair(i, j)); // 崩れるマス記録
break;
}
}
}
wave_count++;
while (!Q[0].empty() || !Q[1].empty()) {
while (!Q[0].empty()) {
i_j = Q[0].front();
Q[0].pop();
for (int p = 0; p < 3; p++) {
for (int q = 0; q < 3; q++) {
int res = check(i_j.first - 1 + p, i_j.second - 1 + q);
switch (res) {
case 0:
break;
case 1:
Q[1].push(make_pair(i_j.first, i_j.second)); // 崩れるマス記録
break;
}
}
}
}
while (!Q[1].empty()) {
i_j = Q[1].front();
field[i_j.first][i_j.second] = '.';
Q[0].push(Q[1].front());
Q[1].pop();
}
wave_count++;
}
cout << wave_count;
return 0;
}
原因は何でしょうか?