Problem p02803 (C++)

Buggy submission (status: Time Limit Exceeded):
#include <bits/stdc++.h>
using namespace std;
int h, w;
vector<vector<char>> s;
vector<vector<bool>> sb;
vector<int> dx = {-1, 0, 1, 0};
vector<int> dy = {0, -1, 0, 1};

struct xydata {
  int x, y, d;
};

void refresh() {
  for (int i = 0; i < h; ++i) {
    for (int j = 0; j < w; ++j) {
      sb.at(i).at(j) = false;
    }
  }
}

int bfs(int sx, int sy, int gx, int gy) {
  xydata first;
  first.x = sx;
  first.y = sy;
  first.d = 0;
  queue<xydata> que;
  que.push(first);

  int depth = 0;
  while (!que.empty()) {
    xydata now = que.front();
    que.pop();
    if (now.x == gx && now.y == gy) {
      depth = now.d;
      break;
    }
    for (int i = 0; i < 4; ++i) {
      xydata next;
      next.x = now.x + dx.at(i);
      next.y = now.y + dy.at(i);
      if (next.x >= 0 && next.x < w && next.y >= 0 && next.y < h) {
        if (s.at(next.y).at(next.x) == '.' && !sb.at(next.y).at(next.x)) {
          next.d = now.d + 1;
          sb.at(now.y).at(now.x) = true;
          que.push(next);
        }
      }
    }
  }
  return depth;
}

int main() {
  cin >> h >> w;
  s = vector<vector<char>>(h, vector<char>(w, '.'));
  sb = vector<vector<bool>>(h, vector<bool>(w, false));
  for (int i = 0; i < h; ++i) {
    for (int j = 0; j < w; ++j) {
      cin >> s.at(i).at(j);
    }
  }

  int maxlen = 0;
  for (int i = 0; i < h; ++i) {
    for (int j = 0; j < w; ++j) {
      if (s.at(i).at(j) == '.') {
        for (int k = 0; k < h; ++k) {
          for (int l = 0; l < w; ++l) {
            if (i != k || j != l) {
              if (s.at(k).at(l) == '.') {
                // cout << j << i << l << k << " ";
                int len = bfs(j, i, l, k);
                // cout << len << endl;
                maxlen = max(maxlen, len);
                refresh();
              }
            }
          }
        }
      }
    }
  }

  cout << maxlen << endl;
}


Fixed submission:
#include <bits/stdc++.h>
using namespace std;
int h, w;
vector<vector<char>> s;
vector<vector<bool>> sb;
vector<int> dx = {-1, 0, 1, 0};
vector<int> dy = {0, -1, 0, 1};

struct xydata {
  int x, y, d;
};

void refresh() {
  for (int i = 0; i < h; ++i) {
    for (int j = 0; j < w; ++j) {
      sb.at(i).at(j) = false;
    }
  }
}

int bfs(int sx, int sy, int gx, int gy) {
  xydata first;
  first.x = sx;
  first.y = sy;
  first.d = 0;
  queue<xydata> que;
  que.push(first);

  int depth = 0;
  while (!que.empty()) {
    xydata now = que.front();
    que.pop();
    if (now.x == gx && now.y == gy) {
      depth = now.d;
      break;
    }
    for (int i = 0; i < 4; ++i) {
      xydata next;
      next.x = now.x + dx.at(i);
      next.y = now.y + dy.at(i);
      if (next.x >= 0 && next.x < w && next.y >= 0 && next.y < h) {
        if (s.at(next.y).at(next.x) == '.' && !sb.at(next.y).at(next.x)) {
          next.d = now.d + 1;
          sb.at(next.y).at(next.x) = true;
          que.push(next);
        }
      }
    }
  }
  return depth;
}

int main() {
  cin >> h >> w;
  s = vector<vector<char>>(h, vector<char>(w, '.'));
  sb = vector<vector<bool>>(h, vector<bool>(w, false));
  for (int i = 0; i < h; ++i) {
    for (int j = 0; j < w; ++j) {
      cin >> s.at(i).at(j);
    }
  }

  int maxlen = 0;
  for (int i = 0; i < h; ++i) {
    for (int j = 0; j < w; ++j) {
      if (s.at(i).at(j) == '.') {
        for (int k = 0; k < h; ++k) {
          for (int l = 0; l < w; ++l) {
            if (i != k || j != l) {
              if (s.at(k).at(l) == '.') {
                // cout << j << i << l << k << " ";
                int len = bfs(j, i, l, k);
                // cout << len << endl;
                maxlen = max(maxlen, len);
                refresh();
              }
            }
          }
        }
      }
    }
  }

  cout << maxlen << endl;
}