Problem p02803 (C++)

Buggy submission (status: Runtime Error):
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define rep(i, n) for (int i = 0; i < n; ++i)

int h, w;

int id(int i, int j) { return i * w + j; }

int main() {
  cin >> h >> w;
  vector<string> s(h);
  rep(i, h) cin >> s[i];
  int d[h * w][h * w];
  rep(i, h * w) rep(j, h * w) d[i][j] = 100000;

  rep(i, h) rep(j, w) {
    if (s[i][j] == '.') {
      if (i == 0 && j == 0) { // 左上
        if (s[i][j + 1] == '.')
          d[id(i, j)][id(i, j) + 1] = 1; // 右
        if (s[i + 1][j] == '.')
          d[id(i, j)][id(i, j) + w] = 1; // 下
      } else if (i == 0 && j == w - 1) { // 右上
        if (s[i + 1][j] == '.')
          d[id(i, j)][id(i, j) + w] = 1; // 下
        if (s[i][j - 1] == '.')
          d[id(i, j)][id(i, j) - 1] = 1; // 左
      } else if (i == 0) {               // 上
        if (s[i][j + 1] == '.')
          d[id(i, j)][id(i, j) + 1] = 1; // 右
        if (s[i + 1][j] == '.')
          d[id(i, j)][id(i, j) + w] = 1; // 下
        if (s[i][j - 1] == '.')
          d[id(i, j)][id(i, j) - 1] = 1; // 左
      } else if (i == h - 1 && j == 0) { // 左下
        if (s[i - 1][j] == '.')
          d[id(i, j)][id(i, j) - w] = 1; // 上
        if (s[i][j + 1] == '.')
          d[id(i, j)][id(i, j) + 1] = 1;     // 右
      } else if (i == h - 1 && h == w - 1) { // 右下
        if (s[i - 1][j] == '.')
          d[id(i, j)][id(i, j) - w] = 1; // 上
        if (s[i][j - 1] == '.')
          d[id(i, j)][id(i, j) - 1] = 1; // 左
      } else if (i == h - 1) {           // 下
        if (s[i - 1][j] == '.')
          d[id(i, j)][id(i, j) - w] = 1; // 上
        if (s[i][j + 1] == '.')
          d[id(i, j)][id(i, j) + 1] = 1; // 右
        if (s[i][j - 1] == '.')
          d[id(i, j)][id(i, j) - 1] = 1; // 左
      } else if (j == 0) {               // 左
        if (s[i - 1][j] == '.')
          d[id(i, j)][id(i, j) - w] = 1; // 上
        if (s[i][j + 1] == '.')
          d[id(i, j)][id(i, j) + 1] = 1; // 右
        if (s[i + 1][j] == '.')
          d[id(i, j)][id(i, j) + w] = 1; // 下
      } else if (j == w - 1) {           // 右
        if (s[i - 1][j] == '.')
          d[id(i, j)][id(i, j) - w] = 1; // 上
        if (s[i + 1][j] == '.')
          d[id(i, j)][id(i, j) + w] = 1; // 下
        if (s[i][j - 1] == '.')
          d[id(i, j)][id(i, j) - 1] = 1; // 左
      } else {                           // 通常
        if (s[i - 1][j] == '.')
          d[id(i, j)][id(i, j) - w] = 1; // 上
        if (s[i][j + 1] == '.')
          d[id(i, j)][id(i, j) + 1] = 1; // 右
        if (s[i + 1][j] == '.')
          d[id(i, j)][id(i, j) + w] = 1; // 下
        if (s[i][j - 1] == '.')
          d[id(i, j)][id(i, j) - 1] = 1; // 左
      }
    }
  }

  // warshal-floyd
  rep(i, h * w) rep(j, h * w) rep(k, h * w) d[j][k] =
      min(d[j][i] + d[i][k], d[j][k]);

  // calc
  int ans = -1;
  rep(i, h * w) rep(j, h * w) {
    if (s[i / w][i % w] == '.' && s[j / w][j % w] == '.')
      ans = max(ans, d[i][j]);
  }

  // output
  cout << ans << endl;
}

Fixed submission:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define rep(i, n) for (int i = 0; i < n; ++i)

int h, w;

int id(int i, int j) { return i * w + j; }

int main() {
  cin >> h >> w;
  vector<string> s(h);
  rep(i, h) cin >> s[i];
  int d[h * w][h * w];
  rep(i, h * w) rep(j, h * w) d[i][j] = 100000;

  if (h == 1) {
    cout << w - 1 << endl;
    return 0;
  } else if (w == 1) {
    cout << h - 1 << endl;
    return 0;
  } else {
    rep(i, h) rep(j, w) {
      if (s[i][j] == '.') {
        if (i == 0 && j == 0) { // 左上
          if (s[i][j + 1] == '.')
            d[id(i, j)][id(i, j) + 1] = 1; // 右
          if (s[i + 1][j] == '.')
            d[id(i, j)][id(i, j) + w] = 1; // 下
        } else if (i == 0 && j == w - 1) { // 右上
          if (s[i + 1][j] == '.')
            d[id(i, j)][id(i, j) + w] = 1; // 下
          if (s[i][j - 1] == '.')
            d[id(i, j)][id(i, j) - 1] = 1; // 左
        } else if (i == 0) {               // 上
          if (s[i][j + 1] == '.')
            d[id(i, j)][id(i, j) + 1] = 1; // 右
          if (s[i + 1][j] == '.')
            d[id(i, j)][id(i, j) + w] = 1; // 下
          if (s[i][j - 1] == '.')
            d[id(i, j)][id(i, j) - 1] = 1; // 左
        } else if (i == h - 1 && j == 0) { // 左下
          if (s[i - 1][j] == '.')
            d[id(i, j)][id(i, j) - w] = 1; // 上
          if (s[i][j + 1] == '.')
            d[id(i, j)][id(i, j) + 1] = 1;     // 右
        } else if (i == h - 1 && h == w - 1) { // 右下
          if (s[i - 1][j] == '.')
            d[id(i, j)][id(i, j) - w] = 1; // 上
          if (s[i][j - 1] == '.')
            d[id(i, j)][id(i, j) - 1] = 1; // 左
        } else if (i == h - 1) {           // 下
          if (s[i - 1][j] == '.')
            d[id(i, j)][id(i, j) - w] = 1; // 上
          if (s[i][j + 1] == '.')
            d[id(i, j)][id(i, j) + 1] = 1; // 右
          if (s[i][j - 1] == '.')
            d[id(i, j)][id(i, j) - 1] = 1; // 左
        } else if (j == 0) {               // 左
          if (s[i - 1][j] == '.')
            d[id(i, j)][id(i, j) - w] = 1; // 上
          if (s[i][j + 1] == '.')
            d[id(i, j)][id(i, j) + 1] = 1; // 右
          if (s[i + 1][j] == '.')
            d[id(i, j)][id(i, j) + w] = 1; // 下
        } else if (j == w - 1) {           // 右
          if (s[i - 1][j] == '.')
            d[id(i, j)][id(i, j) - w] = 1; // 上
          if (s[i + 1][j] == '.')
            d[id(i, j)][id(i, j) + w] = 1; // 下
          if (s[i][j - 1] == '.')
            d[id(i, j)][id(i, j) - 1] = 1; // 左
        } else {                           // 通常
          if (s[i - 1][j] == '.')
            d[id(i, j)][id(i, j) - w] = 1; // 上
          if (s[i][j + 1] == '.')
            d[id(i, j)][id(i, j) + 1] = 1; // 右
          if (s[i + 1][j] == '.')
            d[id(i, j)][id(i, j) + w] = 1; // 下
          if (s[i][j - 1] == '.')
            d[id(i, j)][id(i, j) - 1] = 1; // 左
        }
      }
    }
  }

  // warshal-floyd
  rep(i, h * w) rep(j, h * w) rep(k, h * w) d[j][k] =
      min(d[j][i] + d[i][k], d[j][k]);

  // calc
  int ans = -1;
  rep(i, h * w) rep(j, h * w) {
    if (s[i / w][i % w] == '.' && s[j / w][j % w] == '.')
      ans = max(ans, d[i][j]);
  }

  // output
  cout << ans << endl;
}