Problem p03725 (C++)

Buggy submission (status: Runtime Error):
#include "bits/stdc++.h"

#define REP(i, n) for (ll i = 0; i < n; ++i)
#define RREP(i, n) for (ll i = n - 1; i >= 0; --i)
#define FOR(i, m, n) for (ll i = m; i < n; ++i)
#define RFOR(i, m, n) for (ll i = n - 1; i >= m; --i)
#define ALL(v) (v).begin(), (v).end()
#define PB(a) push_back(a)
#define UNIQUE(v) v.erase(unique(ALL(v)), v.end());
#define DUMP(v)                                                                \
  REP(i, (v).size()) {                                                         \
    cout << v[i];                                                              \
    if (i != v.size() - 1)                                                     \
      cout << " ";                                                             \
    else                                                                       \
      cout << endl;                                                            \
  }
#define INF 1000000001ll
#define MOD 1000000007ll
#define EPS 1e-9

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

using namespace std;
typedef long long ll;
typedef vector<int> vi;
typedef vector<ll> vl;
typedef vector<vi> vvi;
typedef vector<vl> vvl;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
ll max(ll a, int b) { return max(a, ll(b)); }
ll max(int a, ll b) { return max(ll(a), b); }
ll min(ll a, int b) { return min(a, ll(b)); }
ll min(int a, ll b) { return min(ll(a), b); }
///(´・ω・`)(´・ω・`)(´・ω・`)(´・ω・`)(´・ω・`)(´・ω・`)///
int main() {
  cin.tie(0);
  ios::sync_with_stdio(false);
  int h, w, k;
  cin >> h >> w >> k;
  vector<string> v(h);
  REP(i, h) cin >> v[i];
  int sx, sy;
  REP(i, h) {
    REP(j, w) {
      if (v[i][j] == 'S') {
        sy = i;
        sx = j;
      }
    }
  }
  vvi depth(h, vi(w, INF));
  queue<pii> q;
  q.push({sx, sy});
  depth[sy][sx] = 0;
  while (!q.empty()) {
    int x = q.front().first, y = q.front().second;
    q.pop();
    if (x != 0 && depth[y][x - 1] == INF && v[y][x - 1] != '#') {
      q.push({x - 1, y});
      depth[y][x - 1] = depth[y][x] + 1;
    }
    if (y != 0 && depth[y - 1][x] == INF && v[y - 1][x] != '#') {
      q.push({x, y - 1});
      depth[y - 1][x] = depth[y][x] + 1;
    }

    if (x != w - 1 && depth[y][x + 1] == INF && v[y][x + 1] != '#') {
      q.push({x + 1, y});
      depth[y][x + 1] = depth[y][x] + 1;
    }

    if (y != h - 1 && depth[y + 1][x] == INF && v[y + 1][x] != '#') {
      q.push({x, y + 1});
      depth[y + 1][x] = depth[x][y] + 1;
    }
  }
  int dist = INF;
  REP(i, h) {
    REP(j, w) {
      if (depth[i][j] <= k) {
        dist = min(dist, min(i, min(j, min(h - i - 1, w - j - 1))));
      }
    }
  }
  cout << (dist + k - 1) / k + 1 << endl;
  return 0;
}


Fixed submission:
#include "bits/stdc++.h"

#define REP(i, n) for (ll i = 0; i < n; ++i)
#define RREP(i, n) for (ll i = n - 1; i >= 0; --i)
#define FOR(i, m, n) for (ll i = m; i < n; ++i)
#define RFOR(i, m, n) for (ll i = n - 1; i >= m; --i)
#define ALL(v) (v).begin(), (v).end()
#define PB(a) push_back(a)
#define UNIQUE(v) v.erase(unique(ALL(v)), v.end());
#define DUMP(v)                                                                \
  REP(i, (v).size()) {                                                         \
    cout << v[i];                                                              \
    if (i != v.size() - 1)                                                     \
      cout << " ";                                                             \
    else                                                                       \
      cout << endl;                                                            \
  }
#define INF 1000000001ll
#define MOD 1000000007ll
#define EPS 1e-9

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

using namespace std;
typedef long long ll;
typedef vector<int> vi;
typedef vector<ll> vl;
typedef vector<vi> vvi;
typedef vector<vl> vvl;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
ll max(ll a, int b) { return max(a, ll(b)); }
ll max(int a, ll b) { return max(ll(a), b); }
ll min(ll a, int b) { return min(a, ll(b)); }
ll min(int a, ll b) { return min(ll(a), b); }
///(´・ω・`)(´・ω・`)(´・ω・`)(´・ω・`)(´・ω・`)(´・ω・`)///
int main() {
  cin.tie(0);
  ios::sync_with_stdio(false);
  int h, w, k;
  cin >> h >> w >> k;
  vector<string> v(h);
  REP(i, h) cin >> v[i];
  int sx, sy;
  REP(i, h) {
    REP(j, w) {
      if (v[i][j] == 'S') {
        sy = i;
        sx = j;
      }
    }
  }
  vvi depth(h, vi(w, INF));
  queue<pii> q;
  q.push({sx, sy});
  depth[sy][sx] = 0;
  while (!q.empty()) {
    int x = q.front().first, y = q.front().second;
    q.pop();
    if (x != 0 && depth[y][x - 1] == INF && v[y][x - 1] != '#') {
      q.push({x - 1, y});
      depth[y][x - 1] = depth[y][x] + 1;
    }
    if (y != 0 && depth[y - 1][x] == INF && v[y - 1][x] != '#') {
      q.push({x, y - 1});
      depth[y - 1][x] = depth[y][x] + 1;
    }

    if (x != w - 1 && depth[y][x + 1] == INF && v[y][x + 1] != '#') {
      q.push({x + 1, y});
      depth[y][x + 1] = depth[y][x] + 1;
    }

    if (y != h - 1 && depth[y + 1][x] == INF && v[y + 1][x] != '#') {
      q.push({x, y + 1});
      depth[y + 1][x] = depth[y][x] + 1;
    }
  }
  int dist = INF;
  REP(i, h) {
    REP(j, w) {
      if (depth[i][j] <= k) {
        dist = min(dist, min(i, min(j, min(h - i - 1, w - j - 1))));
      }
    }
  }
  cout << (dist + k - 1) / k + 1 << endl;
  return 0;
}