Problem p02803 (C++)

Buggy submission (status: Runtime Error):
// 各スタート地点からDFS
// 探索が終わるまでの距離をカウント
// 最も長かったスタート地点とそのゴール地点を返す

// bfsの引数：現在の場所/前の場所
// グローバル：W/H/S/mxdist
// 任意のスタートから任意の位置までの距離 : dist

#include <bits/stdc++.h>
using namespace std;
int H, W, mxdist = 0;
vector<vector<char>> S(20, vector<char>(20));
typedef pair<int, int> P;
vector<int> dx = {0, 1, 0, -1};
vector<int> dy = {1, 0, -1, 0};

// 返り値は無して良い
void bfs(P pos, P ppos, int dist, vector<vector<int>> &_checked) {

  int px = ppos.second, py = ppos.first;
  _checked.at(pos.first).at(pos.second) =
      min(_checked.at(pos.first).at(pos.second), dist);
  dist++;
  // cout << " " << pos.second << " " << pos.first << endl;

  for (int i = 0; i < 4; i++) {
    int x = pos.second + dx.at(i), y = pos.first + dy.at(i);
    if (y >= 0 && x >= 0 && y < H && x < W && dist < _checked.at(y).at(x)) {

      if (!(x == px && y == py) && S.at(y).at(x) == '.')
        bfs(P(y, x), pos, dist, _checked);
    }
  }

  /*if(mxdist < _checked.at(pos.first).at(pos.second)){
    mxdist = _checked.at(pos.first).at(pos.second);
  }*/
}

int main() {

  int i, j;
  cin >> H >> W;

  for (i = 0; i < H; i++) {
    for (j = 0; j < W; j++) {

      cin >> S.at(i).at(j);
    }
  }

  for (i = 0; i < H; i++) {
    for (j = 0; j < W; j++) {

      vector<vector<int>> checked(H, vector<int>(W, 401));
      if (S.at(i).at(j) == '#')
        continue;
      bfs(P(i, j), P(-1, -1), 0, checked);

      for (int _i = 0; _i < H; _i++) {
        for (int _j = 0; _j < H; _j++) {
          if (mxdist <= checked.at(_i).at(_j) && checked.at(_i).at(_j) != 401)
            mxdist = checked.at(_i).at(_j);
        }
      }
    }
  }
  cout << mxdist << endl;
}

Fixed submission:
// 各スタート地点からDFS
// 探索が終わるまでの距離をカウント
// 最も長かったスタート地点とそのゴール地点を返す

// bfsの引数：現在の場所/前の場所
// グローバル：W/H/S/mxdist
// 任意のスタートから任意の位置までの距離 : dist

#include <bits/stdc++.h>
using namespace std;
int H, W, mxdist = 0;
vector<vector<char>> S(20, vector<char>(20));
typedef pair<int, int> P;
vector<int> dx = {0, 1, 0, -1};
vector<int> dy = {1, 0, -1, 0};

// 返り値は無して良い
void bfs(P pos, P ppos, int dist, vector<vector<int>> &_checked) {

  int px = ppos.second, py = ppos.first;
  _checked.at(pos.first).at(pos.second) =
      min(_checked.at(pos.first).at(pos.second), dist);
  dist++;
  // cout << " " << pos.second << " " << pos.first << endl;

  for (int i = 0; i < 4; i++) {
    int x = pos.second + dx.at(i), y = pos.first + dy.at(i);
    if (y >= 0 && x >= 0 && y < H && x < W && dist < _checked.at(y).at(x)) {

      if (!(x == px && y == py) && S.at(y).at(x) == '.')
        bfs(P(y, x), pos, dist, _checked);
    }
  }

  /*if(mxdist < _checked.at(pos.first).at(pos.second)){
    mxdist = _checked.at(pos.first).at(pos.second);
  }*/
}

int main() {

  int i, j;
  cin >> H >> W;

  for (i = 0; i < H; i++) {
    for (j = 0; j < W; j++) {

      cin >> S.at(i).at(j);
    }
  }

  for (i = 0; i < H; i++) {
    for (j = 0; j < W; j++) {

      vector<vector<int>> checked(H, vector<int>(W, 401));
      if (S.at(i).at(j) == '#')
        continue;
      bfs(P(i, j), P(-1, -1), 0, checked);

      for (int _i = 0; _i < H; _i++) {
        for (int _j = 0; _j < W; _j++) {
          if (mxdist <= checked.at(_i).at(_j) && checked.at(_i).at(_j) != 401)
            mxdist = checked.at(_i).at(_j);
        }
      }
    }
  }
  cout << mxdist << endl;
}