Problem p03574 (C++)

Buggy submission (status: Runtime Error):
#include <bits/stdc++.h>
using namespace std;

int main() {
  size_t h, w;
  cin >> h >> w;
  string S, s;
  cin >> S;
  for (size_t i = 1; i < h; ++i) {
    cin >> s;
    S += s;
  }
  size_t p;
  for (size_t H = 0; H < h * w; H += w) {
    for (size_t W = 0; W < w; ++W) {
      p = H + W;
      if (S.at(p) != '#') {
        if (h == 1 && w == 1) {
          if (S.at(p) != '#')
            S.at(p) = '0';
        } else if (h == 1) {
          if (W == 0) {
            if (S.at(p + 1) == '#') {
              if (S.at(p) == '.')
                S.at(p) = '1';
              else
                ++S.at(p);
            }
          } else if (W == w - 1) {
            if (S.at(p + 1) == '#') {
              if (S.at(p) == '.')
                S.at(p) = '1';
              else
                ++S.at(p);
            }
          } else {
            if (S.at(p - 1) == '#') {
              if (S.at(p) == '.')
                S.at(p) = '1';
              else
                ++S.at(p);
            }
            if (S.at(p + 1) == '#') {
              if (S.at(p) == '.')
                S.at(p) = '1';
              else
                ++S.at(p);
            }
          }
        } else if (w == 1) {
          if (H == 0) {
            if (S.at(p + w) == '#') {
              if (S.at(p) == '.')
                S.at(p) = '1';
              else
                ++S.at(p);
            }
          } else if (H == h * w - w) {
            if (S.at(p - w) == '#') {
              if (S.at(p) == '.')
                S.at(p) = '1';
              else
                ++S.at(p);
            }
          } else {
            if (S.at(p - w) == '#') {
              if (S.at(p) == '.')
                S.at(p) = '1';
              else
                ++S.at(p);
            }
            if (S.at(p + w) == '#') {
              if (S.at(p) == '.')
                S.at(p) = '1';
              else
                ++S.at(p);
            }
          }
        } else if (W == 0) {
          if (H == 0) {
            if (S.at(p + 1) == '#') {
              if (S.at(p) == '.')
                S.at(p) = '1';
              else
                ++S.at(p);
            }
            if (S.at(p + 1 + w) == '#') {
              if (S.at(p) == '.')
                S.at(p) = '1';
              else
                ++S.at(p);
            }
            if (S.at(p + w) == '#') {
              if (S.at(p) == '.')
                S.at(p) = '1';
              else
                ++S.at(p);
            }
          } else if (H == h * w - w) {
            if (S.at(p - w) == '#') {
              if (S.at(p) == '.')
                S.at(p) = '1';
              else
                ++S.at(p);
            }
            if (S.at(p + 1 - w) == '#') {
              if (S.at(p) == '.')
                S.at(p) = '1';
              else
                ++S.at(p);
            }
            if (S.at(p + 1) == '#') {
              if (S.at(p) == '.')
                S.at(p) = '1';
              else
                ++S.at(p);
            }
          } else {
            if (S.at(p - w) == '#') {
              if (S.at(p) == '.')
                S.at(p) = '1';
              else
                ++S.at(p);
            }
            if (S.at(p + 1 - w) == '#') {
              if (S.at(p) == '.')
                S.at(p) = '1';
              else
                ++S.at(p);
            }
            if (S.at(p + 1) == '#') {
              if (S.at(p) == '.')
                S.at(p) = '1';
              else
                ++S.at(p);
            }
            if (S.at(p + 1 + w) == '#') {
              if (S.at(p) == '.')
                S.at(p) = '1';
              else
                ++S.at(p);
            }
            if (S.at(p + w) == '#') {
              if (S.at(p) == '.')
                S.at(p) = '1';
              else
                ++S.at(p);
            }
          }
        } else if (H == 0) {
          if (W == w - 1) {
            if (S.at(p + w) == '#') {
              if (S.at(p) == '.')
                S.at(p) = '1';
              else
                ++S.at(p);
            }
            if (S.at(p - 1 + w) == '#') {
              if (S.at(p) == '.')
                S.at(p) = '1';
              else
                ++S.at(p);
            }
            if (S.at(p - 1) == '#') {
              if (S.at(p) == '.')
                S.at(p) = '1';
              else
                ++S.at(p);
            }
          } else {
            if (S.at(p + 1) == '#') {
              if (S.at(p) == '.')
                S.at(p) = '1';
              else
                ++S.at(p);
            }
            if (S.at(p + 1 + w) == '#') {
              if (S.at(p) == '.')
                S.at(p) = '1';
              else
                ++S.at(p);
            }
            if (S.at(p + w) == '#') {
              if (S.at(p) == '.')
                S.at(p) = '1';
              else
                ++S.at(p);
            }
            if (S.at(p - 1 + w) == '#') {
              if (S.at(p) == '.')
                S.at(p) = '1';
              else
                ++S.at(p);
            }
            if (S.at(p - 1) == '#') {
              if (S.at(p) == '.')
                S.at(p) = '1';
              else
                ++S.at(p);
            }
          }
        } else if (W == w - 1) {
          if (H == h * w - w) {
            if (S.at(p - w) == '#') {
              if (S.at(p) == '.')
                S.at(p) = '1';
              else
                ++S.at(p);
            }
            if (S.at(p - 1) == '#') {
              if (S.at(p) == '.')
                S.at(p) = '1';
              else
                ++S.at(p);
            }
            if (S.at(p - 1 - w) == '#') {
              if (S.at(p) == '.')
                S.at(p) = '1';
              else
                ++S.at(p);
            }
          } else {
            if (S.at(p - w) == '#') {
              if (S.at(p) == '.')
                S.at(p) = '1';
              else
                ++S.at(p);
            }
            if (S.at(p + w) == '#') {
              if (S.at(p) == '.')
                S.at(p) = '1';
              else
                ++S.at(p);
            }
            if (S.at(p - 1 + w) == '#') {
              if (S.at(p) == '.')
                S.at(p) = '1';
              else
                ++S.at(p);
            }
            if (S.at(p - 1) == '#') {
              if (S.at(p) == '.')
                S.at(p) = '1';
              else
                ++S.at(p);
            }
            if (S.at(p - 1 - w) == '#') {
              if (S.at(p) == '.')
                S.at(p) = '1';
              else
                ++S.at(p);
            }
          }
        } else if (H == h * w - w) {
          {
            if (S.at(p - w) == '#') {
              if (S.at(p) == '.')
                S.at(p) = '1';
              else
                ++S.at(p);
            }
            if (S.at(p + 1 - w) == '#') {
              if (S.at(p) == '.')
                S.at(p) = '1';
              else
                ++S.at(p);
            }
            if (S.at(p + 1) == '#') {
              if (S.at(p) == '.')
                S.at(p) = '1';
              else
                ++S.at(p);
            }
            if (S.at(p - 1) == '#') {
              if (S.at(p) == '.')
                S.at(p) = '1';
              else
                ++S.at(p);
            }
            if (S.at(p - 1 - w) == '#') {
              if (S.at(p) == '.')
                S.at(p) = '1';
              else
                ++S.at(p);
            }
          }
        } else {
          if (S.at(p - w) == '#') {
            if (S.at(p) == '.')
              S.at(p) = '1';
            else
              ++S.at(p);
          }
          if (S.at(p + 1 - w) == '#') {
            if (S.at(p) == '.')
              S.at(p) = '1';
            else
              ++S.at(p);
          }
          if (S.at(p + 1) == '#') {
            if (S.at(p) == '.')
              S.at(p) = '1';
            else
              ++S.at(p);
          }
          if (S.at(p + 1 + w) == '#') {
            if (S.at(p) == '.')
              S.at(p) = '1';
            else
              ++S.at(p);
          }
          if (S.at(p + w) == '#') {
            if (S.at(p) == '.')
              S.at(p) = '1';
            else
              ++S.at(p);
          }
          if (S.at(p - 1 + w) == '#') {
            if (S.at(p) == '.')
              S.at(p) = '1';
            else
              ++S.at(p);
          }
          if (S.at(p - 1) == '#') {
            if (S.at(p) == '.')
              S.at(p) = '1';
            else
              ++S.at(p);
          }
          if (S.at(p - 1 - w) == '#') {
            if (S.at(p) == '.')
              S.at(p) = '1';
            else
              ++S.at(p);
          }
        }
      }
    }
  }
  for (size_t H = 0; H < h * w; H += w) {
    for (size_t W = 0; W < w; ++W) {
      if (S.at(H + W) == '.')
        S.at(H + W) = '0';
      cout << S.at(H + W);
    }
    cout << "\n"s;
  }
}

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

int main() {
  size_t h, w;
  cin >> h >> w;
  string S, s;
  cin >> S;
  for (size_t i = 1; i < h; ++i) {
    cin >> s;
    S += s;
  }
  size_t p;
  for (size_t H = 0; H < h * w; H += w) {
    for (size_t W = 0; W < w; ++W) {
      p = H + W;
      if (S.at(p) != '#') {
        if (h == 1 && w == 1) {
          if (S.at(p) != '#')
            S.at(p) = '0';
        } else if (h == 1) {
          if (W == 0) {
            if (S.at(p + 1) == '#') {
              if (S.at(p) == '.')
                S.at(p) = '1';
              else
                ++S.at(p);
            }
          } else if (W == w - 1) {
            if (S.at(p - 1) == '#') {
              if (S.at(p) == '.')
                S.at(p) = '1';
              else
                ++S.at(p);
            }
          } else {
            if (S.at(p - 1) == '#') {
              if (S.at(p) == '.')
                S.at(p) = '1';
              else
                ++S.at(p);
            }
            if (S.at(p + 1) == '#') {
              if (S.at(p) == '.')
                S.at(p) = '1';
              else
                ++S.at(p);
            }
          }
        } else if (w == 1) {
          if (H == 0) {
            if (S.at(p + w) == '#') {
              if (S.at(p) == '.')
                S.at(p) = '1';
              else
                ++S.at(p);
            }
          } else if (H == h * w - w) {
            if (S.at(p - w) == '#') {
              if (S.at(p) == '.')
                S.at(p) = '1';
              else
                ++S.at(p);
            }
          } else {
            if (S.at(p - w) == '#') {
              if (S.at(p) == '.')
                S.at(p) = '1';
              else
                ++S.at(p);
            }
            if (S.at(p + w) == '#') {
              if (S.at(p) == '.')
                S.at(p) = '1';
              else
                ++S.at(p);
            }
          }
        } else if (W == 0) {
          if (H == 0) {
            if (S.at(p + 1) == '#') {
              if (S.at(p) == '.')
                S.at(p) = '1';
              else
                ++S.at(p);
            }
            if (S.at(p + 1 + w) == '#') {
              if (S.at(p) == '.')
                S.at(p) = '1';
              else
                ++S.at(p);
            }
            if (S.at(p + w) == '#') {
              if (S.at(p) == '.')
                S.at(p) = '1';
              else
                ++S.at(p);
            }
          } else if (H == h * w - w) {
            if (S.at(p - w) == '#') {
              if (S.at(p) == '.')
                S.at(p) = '1';
              else
                ++S.at(p);
            }
            if (S.at(p + 1 - w) == '#') {
              if (S.at(p) == '.')
                S.at(p) = '1';
              else
                ++S.at(p);
            }
            if (S.at(p + 1) == '#') {
              if (S.at(p) == '.')
                S.at(p) = '1';
              else
                ++S.at(p);
            }
          } else {
            if (S.at(p - w) == '#') {
              if (S.at(p) == '.')
                S.at(p) = '1';
              else
                ++S.at(p);
            }
            if (S.at(p + 1 - w) == '#') {
              if (S.at(p) == '.')
                S.at(p) = '1';
              else
                ++S.at(p);
            }
            if (S.at(p + 1) == '#') {
              if (S.at(p) == '.')
                S.at(p) = '1';
              else
                ++S.at(p);
            }
            if (S.at(p + 1 + w) == '#') {
              if (S.at(p) == '.')
                S.at(p) = '1';
              else
                ++S.at(p);
            }
            if (S.at(p + w) == '#') {
              if (S.at(p) == '.')
                S.at(p) = '1';
              else
                ++S.at(p);
            }
          }
        } else if (H == 0) {
          if (W == w - 1) {
            if (S.at(p + w) == '#') {
              if (S.at(p) == '.')
                S.at(p) = '1';
              else
                ++S.at(p);
            }
            if (S.at(p - 1 + w) == '#') {
              if (S.at(p) == '.')
                S.at(p) = '1';
              else
                ++S.at(p);
            }
            if (S.at(p - 1) == '#') {
              if (S.at(p) == '.')
                S.at(p) = '1';
              else
                ++S.at(p);
            }
          } else {
            if (S.at(p + 1) == '#') {
              if (S.at(p) == '.')
                S.at(p) = '1';
              else
                ++S.at(p);
            }
            if (S.at(p + 1 + w) == '#') {
              if (S.at(p) == '.')
                S.at(p) = '1';
              else
                ++S.at(p);
            }
            if (S.at(p + w) == '#') {
              if (S.at(p) == '.')
                S.at(p) = '1';
              else
                ++S.at(p);
            }
            if (S.at(p - 1 + w) == '#') {
              if (S.at(p) == '.')
                S.at(p) = '1';
              else
                ++S.at(p);
            }
            if (S.at(p - 1) == '#') {
              if (S.at(p) == '.')
                S.at(p) = '1';
              else
                ++S.at(p);
            }
          }
        } else if (W == w - 1) {
          if (H == h * w - w) {
            if (S.at(p - w) == '#') {
              if (S.at(p) == '.')
                S.at(p) = '1';
              else
                ++S.at(p);
            }
            if (S.at(p - 1) == '#') {
              if (S.at(p) == '.')
                S.at(p) = '1';
              else
                ++S.at(p);
            }
            if (S.at(p - 1 - w) == '#') {
              if (S.at(p) == '.')
                S.at(p) = '1';
              else
                ++S.at(p);
            }
          } else {
            if (S.at(p - w) == '#') {
              if (S.at(p) == '.')
                S.at(p) = '1';
              else
                ++S.at(p);
            }
            if (S.at(p + w) == '#') {
              if (S.at(p) == '.')
                S.at(p) = '1';
              else
                ++S.at(p);
            }
            if (S.at(p - 1 + w) == '#') {
              if (S.at(p) == '.')
                S.at(p) = '1';
              else
                ++S.at(p);
            }
            if (S.at(p - 1) == '#') {
              if (S.at(p) == '.')
                S.at(p) = '1';
              else
                ++S.at(p);
            }
            if (S.at(p - 1 - w) == '#') {
              if (S.at(p) == '.')
                S.at(p) = '1';
              else
                ++S.at(p);
            }
          }
        } else if (H == h * w - w) {
          {
            if (S.at(p - w) == '#') {
              if (S.at(p) == '.')
                S.at(p) = '1';
              else
                ++S.at(p);
            }
            if (S.at(p + 1 - w) == '#') {
              if (S.at(p) == '.')
                S.at(p) = '1';
              else
                ++S.at(p);
            }
            if (S.at(p + 1) == '#') {
              if (S.at(p) == '.')
                S.at(p) = '1';
              else
                ++S.at(p);
            }
            if (S.at(p - 1) == '#') {
              if (S.at(p) == '.')
                S.at(p) = '1';
              else
                ++S.at(p);
            }
            if (S.at(p - 1 - w) == '#') {
              if (S.at(p) == '.')
                S.at(p) = '1';
              else
                ++S.at(p);
            }
          }
        } else {
          if (S.at(p - w) == '#') {
            if (S.at(p) == '.')
              S.at(p) = '1';
            else
              ++S.at(p);
          }
          if (S.at(p + 1 - w) == '#') {
            if (S.at(p) == '.')
              S.at(p) = '1';
            else
              ++S.at(p);
          }
          if (S.at(p + 1) == '#') {
            if (S.at(p) == '.')
              S.at(p) = '1';
            else
              ++S.at(p);
          }
          if (S.at(p + 1 + w) == '#') {
            if (S.at(p) == '.')
              S.at(p) = '1';
            else
              ++S.at(p);
          }
          if (S.at(p + w) == '#') {
            if (S.at(p) == '.')
              S.at(p) = '1';
            else
              ++S.at(p);
          }
          if (S.at(p - 1 + w) == '#') {
            if (S.at(p) == '.')
              S.at(p) = '1';
            else
              ++S.at(p);
          }
          if (S.at(p - 1) == '#') {
            if (S.at(p) == '.')
              S.at(p) = '1';
            else
              ++S.at(p);
          }
          if (S.at(p - 1 - w) == '#') {
            if (S.at(p) == '.')
              S.at(p) = '1';
            else
              ++S.at(p);
          }
        }
      }
    }
  }
  for (size_t H = 0; H < h * w; H += w) {
    for (size_t W = 0; W < w; ++W) {
      if (S.at(H + W) == '.')
        S.at(H + W) = '0';
      cout << S.at(H + W);
    }
    cout << "\n"s;
  }
}