Problem p02803 (C++)

Buggy submission (status: Time Limit Exceeded):
#include <bits/stdc++.h>

using namespace std;
typedef long long ll;
typedef vector<ll> vl;
typedef vector<string> vs;
typedef pair<ll, ll> P;
#define FOR(i, a, b) for (ll i = (a); i < (b); i++)
#define REP(i, n) FOR(i, 0, n)

/***** define constant start *******/
const ll MOD = 1000000007;
const double PI = 3.1415926535897932;
const ll INF = 10000000000;
/****** define constant end ********/
ll dx[4] = {1, 0, -1, 0}, dy[4] = {0, 1, 0, -1};
ll bfs(ll sx, ll sy, ll gx, ll gy, ll h, ll w, vector<vector<string>> s) {
  ll d[25][25];
  queue<P> que;
  REP(i, h) {
    REP(j, w) { d[i][j] = INF; }
  }
  que.push(P(sx, sy));
  d[sx][sy] = 0;
  while (que.size()) {
    P p = que.front();
    que.pop();
    if (p.first == gx && p.second == gy)
      break;
    REP(i, 4) {
      ll nx = p.first + dx[i], ny = p.second + dy[i];
      if (0 <= nx && nx < h && 0 <= ny && ny < w && s[nx][ny] != "#" &&
          d[nx][ny] == INF) {
        que.push(P(nx, ny));
        d[nx][ny] = d[p.first][p.second] + 1;
      }
    }
  }
  return d[gx][gy];
}

/****** define variable start ******/
ll h, w;
/******* define variable end *******/
ll solve() {
  cin >> h >> w;
  vector<vector<string>> s(h, vector<string>(w));
  REP(i, h) {
    string tmp;
    cin >> tmp;
    REP(j, w) { s[i][j] = tmp.substr(j, 1); }
  }
  ll ans = 0;
  REP(i, h) {
    REP(j, w) {
      if (s[i][j] == ".") {
        REP(k, h) {
          REP(l, w) {
            if (s[i][j] == "." && s[k][l] == ".") {
              ll tmp = bfs(i, j, k, l, h, w, s);
              if (tmp > ans) {
                ans = tmp;
              }
            }
          }
        }
      }
    }
  }
  cout << ans << endl;

  return 0;
}
int main() {
  // clock_t start = clock();
  cout << std::fixed << std::setprecision(10);
  ios::sync_with_stdio(false);
  cin.tie(nullptr);
  ll end_solve = solve();
  /*
  clock_t end = clock();
  const double time = static_cast<double>(end - start) / CLOCKS_PER_SEC *
  1000.0; printf("time %lf[ms]\n", time);
  */
  return (int)end_solve;
}


Fixed submission:
#include <bits/stdc++.h>

using namespace std;
typedef long long ll;
typedef vector<ll> vl;
typedef vector<string> vs;
typedef pair<ll, ll> P;
#define FOR(i, a, b) for (ll i = (a); i < (b); i++)
#define REP(i, n) FOR(i, 0, n)

/***** define constant start *******/
const ll MOD = 1000000007;
const double PI = 3.1415926535897932;
const ll INF = 10000000000;
/****** define constant end ********/
ll dx[4] = {1, 0, -1, 0}, dy[4] = {0, 1, 0, -1};
ll bfs(ll sx, ll sy, ll gx, ll gy, ll h, ll w, vector<vector<string>> s) {
  ll d[25][25];
  queue<P> que;
  REP(i, h) {
    REP(j, w) { d[i][j] = INF; }
  }
  que.push(P(sx, sy));
  d[sx][sy] = 0;
  while (que.size()) {
    P p = que.front();
    que.pop();
    if (p.first == gx && p.second == gy)
      break;
    REP(i, 4) {
      ll nx = p.first + dx[i], ny = p.second + dy[i];
      if (0 <= nx && nx < h && 0 <= ny && ny < w && s[nx][ny] != "#" &&
          d[nx][ny] == INF) {
        que.push(P(nx, ny));
        d[nx][ny] = d[p.first][p.second] + 1;
      }
    }
  }
  return d[gx][gy];
}

/****** define variable start ******/
ll h, w;
/******* define variable end *******/
ll solve() {
  cin >> h >> w;
  vector<vector<string>> s(h, vector<string>(w));
  REP(i, h) {
    string tmp;
    cin >> tmp;
    REP(j, w) { s[i][j] = tmp.substr(j, 1); }
  }
  ll ans = 0;
  REP(i, h) {
    REP(j, w) {
      if (s[i][j] == ".") {
        for (ll k = i; k < h; k++) {
          REP(l, w) {
            if (s[i][j] == "." && s[k][l] == ".") {
              ll tmp = bfs(i, j, k, l, h, w, s);
              if (tmp > ans) {
                ans = tmp;
              }
            }
          }
        }
      }
    }
  }
  cout << ans << endl;

  return 0;
}
int main() {
  // clock_t start = clock();
  cout << std::fixed << std::setprecision(10);
  ios::sync_with_stdio(false);
  cin.tie(nullptr);
  ll end_solve = solve();
  /*
  clock_t end = clock();
  const double time = static_cast<double>(end - start) / CLOCKS_PER_SEC *
  1000.0; printf("time %lf[ms]\n", time);
  */
  return (int)end_solve;
}