#include #define rep(i,n) for(int i=0;i > riku; int di[8] = {-1, -1, -1, 0, 0, 1, 1, 1}; int dj[8] = {-1, 0, 1, -1, 1, -1, 0, 1}; //海に隣接していたらtrueを返す bool check(int i, int j) { rep(ii,8) { int ni = i + di[ii]; int nj = j + dj[ii]; if (ni < 0 || H <= ni || nj < 0 || W <= nj) { return true; } if (grid[ni][nj] == '.') { return true; } } return false; } signed main() { cin >> H >> W; rep(i,H) { cin >> grid[i]; } rep(i,H) { rep(j,W) { if (grid[i][j] == '#') { riku.insert(pair(i, j)); } } } int ans = 0; while (!riku.empty()) { //printf("riku.size() = %d\n", riku.size()); ans++; set > new_riku; set > unimisuru; set >::iterator it = riku.begin(); while (it != riku.end()) { if (check(it->first, it->second)) { unimisuru.insert(pair(it->first, it->second)); //grid[it->first][it->second] = '.'; } else { new_riku.insert(pair(it->first, it->second)); } ++it; } it = unimisuru.begin(); while (it != unimisuru.end()) { grid[it->first][it->second] = '.'; ++it; } riku = new_riku; } cout << ans << endl; }