Problem p02579 (C++) — buggy submission, verdict: Runtime Error

#include <bits/stdc++.h>
using namespace std;
#define int long long
// 4 5
// 1 2
// 2 5
// #.###
//.###.
// #..##
// #..##

int x[4] = {0, 1, 0, -1};
int y[4] = {1, 0, -1, 0};

const int N = 1100;
int h, w, c1, c2, d1, d2;
char s[N][N];
int a[N][N];
int num;
set<int> adj[N * N];
int d[N * N];

void dfs(int i, int j) {
  for (int k = 0; k < 4; k++) {
    int xx = i + x[k];
    int yy = j + y[k];
    if (xx >= 0 && yy >= 0 && xx < h && yy < w && a[xx][yy] == 0 &&
        (s[xx][yy] == '.')) {
      a[xx][yy] = num;
      dfs(xx, yy);
    }
  }
  return;
}

signed main() {
  ios_base::sync_with_stdio(0), cin.tie(0), cout.tie(0);

  cin >> h >> w;
  cin >> c1 >> c2 >> d1 >> d2;
  for (int i = 0; i < h; i++) {
    for (int j = 0; j < w; j++) {
      cin >> s[i][j];
    }
  }

  for (int i = 0; i < h; i++) {
    for (int j = 0; j < w; j++) {
      if (a[i][j] != 0 or s[i][j] == '#')
        continue;

      num++;
      a[i][j] = num;
      dfs(i, j);
    }
  }
  //    for (int i=0; i<h; i++){
  //        for (int j=0; j<w; j++){
  //            cout<<a[i][j]<<" ";
  //        }
  //        cout<<endl;
  //    }
  //
  //    cout<<num<<endl;

  set<pair<int, int>> all;

  for (int i = 0; i < h; i++) {
    for (int j = 0; j < w; j++) {
      if (a[i][j] == 0)
        continue;
      set<int> u;
      for (int k = i - 2; k <= i + 2; k++) {
        for (int l = j - 2; l <= j + 2; l++) {
          if (k >= 0 && l >= 0 && k < h && l < w) {
            if (a[k][l] == 0)
              continue;
            u.insert(a[k][l]);
          }
        }
      }
      //            cout<<"here ";
      //            for (auto e:u){
      //                cout<<e<<" ";
      //            }
      //            cout<<endl;
      for (auto e : u) {
        if (e == a[i][j])
          continue;
        all.insert({a[i][j], e});
      }
    }
  }

  //    for (auto p:all){
  //        cout<<p.first<<" "<<p.second<<endl;
  //    }

  for (auto p : all) {
    adj[p.first].insert(p.second);
    adj[p.second].insert(p.first);
  }
  //
  int start = a[c1 - 1][c2 - 1];
  int last = a[d1 - 1][d2 - 1];
  //
  if (start == last) {
    cout << 0 << endl;
    return 0;
  }
  //    cout<<start<<" "<<last<<endl;
  memset(d, -1, sizeof(d));
  queue<int> q;
  q.push(start);
  int curr = 1;
  d[start] = 1;
  while (!q.empty()) {
    int sz = q.size();
    //        cout<<"here "<<curr<<" ";
    while (sz--) {
      int u = q.front();
      q.pop();
      //            cout<<u<<" ";
      for (auto v : adj[u]) {
        if (d[v] == -1) {
          d[v] = curr;
          q.push(v);
        }
      }
    }
    //        cout<<endl;
    curr++;
  }

  //    for (int i=0; i<=num; i++){
  //        cout<<d[i]<<" ";
  //    }
  //    cout<<endl;

  cout << d[last] << endl;

  return 0;
}


Error: 0

Fixed submission:

#include <bits/stdc++.h>
using namespace std;
#define int long long

int x[4] = {0, 1, 0, -1};
int y[4] = {1, 0, -1, 0};

const int N = 1100;
int h, w, c1, c2, d1, d2;
char s[N][N];
int a[N][N];
int num;
vector<int> adj[N];
int d[N * N];

void dfs(int i, int j) {
  for (int k = 0; k < 4; k++) {
    int xx = i + x[k];
    int yy = j + y[k];
    if (xx >= 0 && yy >= 0 && xx < h && yy < w && a[xx][yy] == 0 &&
        (s[xx][yy] == '.')) {
      a[xx][yy] = num;
      dfs(xx, yy);
    }
  }
  return;
}

void dfs1(int a, int h) {
  d[a] = h;
  for (auto e : adj[a]) {
    if (d[e] != -1)
      continue;
    dfs1(e, h + 1);
  }
  return;
}

signed main() {
  ios_base::sync_with_stdio(0), cin.tie(0), cout.tie(0);

  cin >> h >> w;
  cin >> c1 >> c2 >> d1 >> d2;
  for (int i = 0; i < h; i++) {
    for (int j = 0; j < w; j++) {
      cin >> s[i][j];
    }
  }

  for (int i = 0; i < h; i++) {
    for (int j = 0; j < w; j++) {
      if (a[i][j] != 0 or s[i][j] == '#')
        continue;

      num++;
      a[i][j] = num;
      dfs(i, j);
    }
  }
  //    for (int i=0; i<h; i++){
  //        for (int j=0; j<w; j++){
  //            cout<<a[i][j]<<" ";
  //        }
  //        cout<<endl;
  //    }
  //
  //    cout<<num<<endl;

  set<pair<int, int>> all;

  for (int i = 0; i < h; i++) {
    for (int j = 0; j < w; j++) {
      if (a[i][j] == 0)
        continue;
      set<int> u;
      for (int k = i - 2; k <= i + 2; k++) {
        for (int l = j - 2; l <= j + 2; l++) {
          if (k >= 0 && l >= 0 && k < h && l < w) {
            if (a[k][l] == 0)
              continue;
            u.insert(a[k][l]);
          }
        }
      }
      //            cout<<"here ";
      //            for (auto e:u){
      //                cout<<e<<" ";
      //            }
      //            cout<<endl;
      for (auto e : u) {
        if (e == a[i][j])
          continue;
        all.insert({a[i][j], e});
      }
    }
  }

  //    for (auto p:all){
  //        cout<<p.first<<" "<<p.second<<endl;
  //    }

  for (auto p : all) {
    int e1 = p.first;
    int e2 = p.second;
    //        if (e1>=0 && e1<N && e2>=0 && e2<N){
    adj[e1].push_back(e2);
    //        }
  }
  //
  int start = a[c1 - 1][c2 - 1];
  int last = a[d1 - 1][d2 - 1];
  //
  //    if (start==last) {
  //        cout<<0<<endl;
  //        return 0;
  //    }
  //    cout<<start<<" "<<last<<endl;
  memset(d, -1, sizeof(d));
  dfs1(start, 0);
  //    for (int i=0; i<=num; i++){
  //        cout<<d[i]<<" ";
  //    }
  //    cout<<endl;

  cout << d[last] << endl;

  return 0;
}