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

// Original Code:
// #include <self/utility>
// #include <self/debug>
// using namespace std;
// int n,m;
// char c[1005][1005];
// pair<pii,int> que[2*1000*1000+5];
// int sx,sy,ex,ey;
// int dx[]={0,1,0,-1};
// int dy[]={1,0,-1,0};
// int dist[1005][1005];
//
// inline bool out(int x,int y)
//{
//	return (x<0 || y<0 || x>=n || y>=m);
// }
//
// int main()
//{
////	freopen("input.txt","r",stdin);
//	cin>>n>>m;
//	cin>>sx>>sy>>ex>>ey;
//	sx--;
//	sy--;
//	ex--;
//	ey--;
//	int l=1000*1000,r=1000*1000;
//	for(int i=0;i<n;i++)
//	{
//		scanf("%s",c[i]);
//	}
//	que[r++]=mp(mp(sx,sy),0);
//	if(c[sx][sy]=='#') over("-1");
//	memset(dist,0x3f,sizeof(dist));
//	dist[sx][sy]=0;
//	while(l!=r)
//	{
//		pair<pii,int> o=que[l++];
//		int x=o.first.first;
//		int y=o.first.second;
//		int cost=o.second;
//		if(dist[x][y]!=cost) continue;
//		if(x==ex && y==ey) over(cost);
//		for(int i=0;i<4;i++)
//		{
//			int nx=x+dx[i];
//			int ny=y+dy[i];
//			if(out(nx,ny)) continue;
//			if(c[nx][ny]=='#') continue;
//			if(dist[nx][ny]<=cost) continue;
//			dist[nx][ny]=cost;
//			que[--l]=mp(mp(nx,ny),cost);
//		}
//		for(int scx=-1;scx<=1;scx+=2)
//		{
//			for(int scy=-1;scy<=1;scy+=2)
//			{
//				for(int d1=0;d1<3;d1++)
//				{
//					for(int d2=0;d2<3;d2++)
//					{
//						int nx=x+scx*d1;
//						int ny=y+scy*d2;
//						if(out(nx,ny)) continue;
//						if(c[nx][ny]=='#') continue;
//						if(dist[nx][ny]<=cost+1)
//continue; 						dist[nx][ny]=cost+1; 						que[r++]=mp(mp(nx,ny),cost+1);
//					}
//				}
//			}
//		}
//	}
//	cout<<-1<<endl;
//	return 0;
//}

// substituted with C++ Inliner
#ifndef _SELF_UTILITY
#define _SELF_UTILITY 1
#include <algorithm>
#include <assert.h>
#include <bitset>
#include <cmath>
#include <iostream>
#include <map>
#include <queue>
#include <set>
#include <stack>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <string>
#include <vector>
#define Endl endl
#define mp make_pair
#define ll long long
#define ull unsigned long long
#define pii pair<int, int>
#define over(A)                                                                \\
  {                                                                            \\
    cout << A << endl;                                                         \\
    exit(0);                                                                   \\
  }
#define all(A) A.begin(), A.end()
#define quickcin ios_base::sync_with_stdio(false);
const int mod = 200003;
const int gmod = 2;
const int inf = 1039074182;
const ll llinf = 1LL * inf * inf;
template <typename T1, typename T2> inline void chmin(T1 &x, T2 b) {
  if (b < x)
    x = b;
}
template <typename T1, typename T2> inline void chmax(T1 &x, T2 b) {
  if (b > x)
    x = b;
}
template <typename T1, typename T2> inline void chadd(T1 &x, T2 b) {
  x += b;
  if (x >= mod)
    x -= mod;
}
template <typename T1, typename T2> inline void chmul(T1 &x, T2 b) {
  x = 1LL * x * b % mod;
}
template <typename T1, typename T2> inline void chmod(T1 &x, T2 b) {
  x %= b, x += b;
  if (x >= b)
    x -= b;
}
#endif

#ifndef _SELF_DEBUG
#define _SELF_DEBUG 1
#ifndef _SELF_OPERATOR
#define _SELF_OPERATOR 1
using namespace std;
template <typename T> ostream &operator<<(ostream &cout, vector<T> vec) {
  cout << "{";
  for (int i = 0; i < vec.size(); i++) {
    cout << vec[i];
    if (i != (int)vec.size() - 1)
      cout << ',';
  }
  cout << "}";
  return cout;
}

template <typename T1, typename T2>
ostream &operator<<(ostream &cout, pair<T1, T2> p) {
  cout << "(" << p.first << ',' << p.second << ")";
  return cout;
}

template <typename T> ostream &operator<<(ostream &cout, set<T> s) {
  vector<T> t;
  for (auto x : s)
    t.push_back(x);
  cout << t;
  return cout;
}

template <typename T> ostream &operator<<(ostream &cout, multiset<T> s) {
  vector<T> t;
  for (auto x : s)
    t.push_back(x);
  cout << t;
  return cout;
}

template <typename T> ostream &operator<<(ostream &cout, queue<T> q) {
  vector<T> t;
  while (q.size()) {
    t.push_back(q.front());
    q.pop();
  }
  cout << t;
  return cout;
}

template <typename T1, typename T2>
ostream &operator<<(ostream &cout, map<T1, T2> m) {
  for (auto &x : m) {
    cout << "Key: " << x.first << ' ' << "Value: " << x.second << endl;
  }
  return cout;
}

template <typename T> T operator*(vector<T> v1, vector<T> v2) {
  assert(v1.size() == v2.size());
  int n = v1.size();
  T res = 0;
  for (int i = 0; i < n; i++) {
    res += v1[i] * v2[i];
  }
  return res;
}

template <typename T1, typename T2>
pair<T1, T2> operator+(pair<T1, T2> x, pair<T1, T2> y) {
  return make_pair(x.first + y.first, x.second + y.second);
}

template <typename T1, typename T2> pair<T1, T2> operator-(pair<T1, T2> x) {
  return make_pair(-x.first, -x.second);
}

template <typename T> vector<vector<T>> operator~(vector<vector<T>> vec) {
  vector<vector<T>> v;
  int n = vec.size(), m = vec[0].size();
  v.resize(m);
  for (int i = 0; i < m; i++) {
    v[i].resize(n);
  }
  for (int i = 0; i < m; i++) {
    for (int j = 0; j < n; j++) {
      v[i][j] = vec[j][i];
    }
  }
  return v;
}
#endif

void print0x(int x) {
  std::vector<int> vec;
  while (x) {
    vec.push_back(x & 1);
    x >>= 1;
  }
  std::reverse(vec.begin(), vec.end());
  for (int i = 0; i < vec.size(); i++) {
    std::cout << vec[i];
  }
  std::cout << ' ';
}

template <typename T> void print0x(T x, int len) {
  std::vector<int> vec;
  while (x) {
    vec.push_back(x & 1);
    x >>= 1;
  }
  reverse(vec.begin(), vec.end());
  for (int i = vec.size(); i < len; i++) {
    putchar('0');
  }
  for (int i = 0; i < vec.size(); i++) {
    std::cout << vec[i];
  }
  std::cout << ' ';
}
#endif
using namespace std;
int n, m;
char c[1005][1005];
pair<pii, int> que[2 * 1000 * 1000 + 5];
int sx, sy, ex, ey;
int dx[] = {0, 1, 0, -1};
int dy[] = {1, 0, -1, 0};
int dist[1005][1005];

inline bool out(int x, int y) { return (x < 0 || y < 0 || x >= n || y >= m); }

int main() {
  //	freopen("input.txt","r",stdin);
  cin >> n >> m;
  cin >> sx >> sy >> ex >> ey;
  sx--;
  sy--;
  ex--;
  ey--;
  int l = 1000 * 1000, r = 1000 * 1000;
  for (int i = 0; i < n; i++) {
    scanf("%s", c[i]);
  }
  que[r++] = mp(mp(sx, sy), 0);
  if (c[sx][sy] == '#')
    over("-1");
  memset(dist, 0x3f, sizeof(dist));
  dist[sx][sy] = 0;
  while (l != r) {
    pair<pii, int> o = que[l++];
    int x = o.first.first;
    int y = o.first.second;
    int cost = o.second;
    if (dist[x][y] != cost)
      continue;
    if (x == ex && y == ey)
      over(cost);
    for (int i = 0; i < 4; i++) {
      int nx = x + dx[i];
      int ny = y + dy[i];
      if (out(nx, ny))
        continue;
      if (c[nx][ny] == '#')
        continue;
      if (dist[nx][ny] <= cost)
        continue;
      dist[nx][ny] = cost;
      que[--l] = mp(mp(nx, ny), cost);
    }
    for (int scx = -1; scx <= 1; scx += 2) {
      for (int scy = -1; scy <= 1; scy += 2) {
        for (int d1 = 0; d1 < 3; d1++) {
          for (int d2 = 0; d2 < 3; d2++) {
            int nx = x + scx * d1;
            int ny = y + scy * d2;
            if (out(nx, ny))
              continue;
            if (c[nx][ny] == '#')
              continue;
            if (dist[nx][ny] <= cost + 1)
              continue;
            dist[nx][ny] = cost + 1;
            que[r++] = mp(mp(nx, ny), cost + 1);
          }
        }
      }
    }
  }
  cout << -1 << endl;
  return 0;
}


Error: 0

Fixed submission:

// Original Code:
// #include <self/utility>
// #include <self/debug>
// using namespace std;
// int n,m;
// char c[1005][1005];
// pair<pii,int> que[2*1000*1000+5];
// int sx,sy,ex,ey;
// int visit[1005][1005];
// int dx[]={0,1,0,-1};
// int dy[]={1,0,-1,0};
//
// inline bool out(int x,int y)
//{
//	return (x<0 || y<0 || x>=n || y>=m);
// }
//
// int main()
//{
////	freopen("input.txt","r",stdin);
//	cin>>n>>m;
//	cin>>sx>>sy>>ex>>ey;
//	sx--;
//	sy--;
//	ex--;
//	ey--;
//	int l=1000*1000,r=1000*1000;
//	for(int i=0;i<n;i++)
//	{
//		scanf("%s",c[i]);
//	}
//	que[r++]=mp(mp(sx,sy),0);
//	while(l!=r)
//	{
//		pair<pii,int> o=que[l++];
//		int x=o.first.first;
//		int y=o.first.second;
//		visit[x][y]=true;
//		int cost=o.second;
//		if(x==ex && y==ey) over(cost);
//		for(int i=0;i<4;i++)
//		{
//			int nx=x+dx[i];
//			int ny=y+dy[i];
//			if(out(nx,ny)) continue;
//			if(c[nx][ny]=='#') continue;
//			if(visit[nx][ny]) continue;
//			que[--l]=mp(mp(nx,ny),cost);
//		}
//		for(int scx=-1;scx<=1;scx+=2)
//		{
//			for(int scy=-1;scy<=1;scy+=2)
//			{
//				for(int d1=0;d1<3;d1++)
//				{
//					for(int d2=0;d2<3;d2++)
//					{
//						int nx=x+scx*d1;
//						int ny=y+scy*d2;
//						if(out(nx,ny)) continue;
//						if(c[nx][ny]=='#') continue;
//						if(visit[nx][ny]) continue;
//						que[r++]=mp(mp(nx,ny),cost+1);
//					}
//				}
//			}
//		}
//	}
//	cout<<-1<<endl;
//	return 0;
//}

// substituted with C++ Inliner
#ifndef _SELF_UTILITY
#define _SELF_UTILITY 1
#include <algorithm>
#include <assert.h>
#include <bitset>
#include <cmath>
#include <iostream>
#include <map>
#include <queue>
#include <set>
#include <stack>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <string>
#include <vector>
#define Endl endl
#define mp make_pair
#define ll long long
#define ull unsigned long long
#define pii pair<int, int>
#define over(A)                                                                \\
  {                                                                            \\
    cout << A << endl;                                                         \\
    exit(0);                                                                   \\
  }
#define all(A) A.begin(), A.end()
#define quickcin ios_base::sync_with_stdio(false);
const int mod = 200003;
const int gmod = 2;
const int inf = 1039074182;
const ll llinf = 1LL * inf * inf;
template <typename T1, typename T2> inline void chmin(T1 &x, T2 b) {
  if (b < x)
    x = b;
}
template <typename T1, typename T2> inline void chmax(T1 &x, T2 b) {
  if (b > x)
    x = b;
}
template <typename T1, typename T2> inline void chadd(T1 &x, T2 b) {
  x += b;
  if (x >= mod)
    x -= mod;
}
template <typename T1, typename T2> inline void chmul(T1 &x, T2 b) {
  x = 1LL * x * b % mod;
}
template <typename T1, typename T2> inline void chmod(T1 &x, T2 b) {
  x %= b, x += b;
  if (x >= b)
    x -= b;
}
#endif

#ifndef _SELF_DEBUG
#define _SELF_DEBUG 1
#ifndef _SELF_OPERATOR
#define _SELF_OPERATOR 1
using namespace std;
template <typename T> ostream &operator<<(ostream &cout, vector<T> vec) {
  cout << "{";
  for (int i = 0; i < vec.size(); i++) {
    cout << vec[i];
    if (i != (int)vec.size() - 1)
      cout << ',';
  }
  cout << "}";
  return cout;
}

template <typename T1, typename T2>
ostream &operator<<(ostream &cout, pair<T1, T2> p) {
  cout << "(" << p.first << ',' << p.second << ")";
  return cout;
}

template <typename T> ostream &operator<<(ostream &cout, set<T> s) {
  vector<T> t;
  for (auto x : s)
    t.push_back(x);
  cout << t;
  return cout;
}

template <typename T> ostream &operator<<(ostream &cout, multiset<T> s) {
  vector<T> t;
  for (auto x : s)
    t.push_back(x);
  cout << t;
  return cout;
}

template <typename T> ostream &operator<<(ostream &cout, queue<T> q) {
  vector<T> t;
  while (q.size()) {
    t.push_back(q.front());
    q.pop();
  }
  cout << t;
  return cout;
}

template <typename T1, typename T2>
ostream &operator<<(ostream &cout, map<T1, T2> m) {
  for (auto &x : m) {
    cout << "Key: " << x.first << ' ' << "Value: " << x.second << endl;
  }
  return cout;
}

template <typename T> T operator*(vector<T> v1, vector<T> v2) {
  assert(v1.size() == v2.size());
  int n = v1.size();
  T res = 0;
  for (int i = 0; i < n; i++) {
    res += v1[i] * v2[i];
  }
  return res;
}

template <typename T1, typename T2>
pair<T1, T2> operator+(pair<T1, T2> x, pair<T1, T2> y) {
  return make_pair(x.first + y.first, x.second + y.second);
}

template <typename T1, typename T2> pair<T1, T2> operator-(pair<T1, T2> x) {
  return make_pair(-x.first, -x.second);
}

template <typename T> vector<vector<T>> operator~(vector<vector<T>> vec) {
  vector<vector<T>> v;
  int n = vec.size(), m = vec[0].size();
  v.resize(m);
  for (int i = 0; i < m; i++) {
    v[i].resize(n);
  }
  for (int i = 0; i < m; i++) {
    for (int j = 0; j < n; j++) {
      v[i][j] = vec[j][i];
    }
  }
  return v;
}
#endif

void print0x(int x) {
  std::vector<int> vec;
  while (x) {
    vec.push_back(x & 1);
    x >>= 1;
  }
  std::reverse(vec.begin(), vec.end());
  for (int i = 0; i < vec.size(); i++) {
    std::cout << vec[i];
  }
  std::cout << ' ';
}

template <typename T> void print0x(T x, int len) {
  std::vector<int> vec;
  while (x) {
    vec.push_back(x & 1);
    x >>= 1;
  }
  reverse(vec.begin(), vec.end());
  for (int i = vec.size(); i < len; i++) {
    putchar('0');
  }
  for (int i = 0; i < vec.size(); i++) {
    std::cout << vec[i];
  }
  std::cout << ' ';
}
#endif
using namespace std;
int n, m;
char c[1005][1005];
pair<pii, int> que[2 * 1000 * 1000 + 5];
int sx, sy, ex, ey;
int visit[1005][1005];
int dx[] = {0, 1, 0, -1};
int dy[] = {1, 0, -1, 0};

inline bool out(int x, int y) { return (x < 0 || y < 0 || x >= n || y >= m); }

int main() {
  //	freopen("input.txt","r",stdin);
  cin >> n >> m;
  cin >> sx >> sy >> ex >> ey;
  sx--;
  sy--;
  ex--;
  ey--;
  int l = 1000 * 1000, r = 1000 * 1000;
  for (int i = 0; i < n; i++) {
    scanf("%s", c[i]);
  }
  que[r++] = mp(mp(sx, sy), 0);
  while (l != r) {
    pair<pii, int> o = que[l++];
    int x = o.first.first;
    int y = o.first.second;
    visit[x][y] = true;
    int cost = o.second;
    if (x == ex && y == ey)
      over(cost);
    for (int i = 0; i < 4; i++) {
      int nx = x + dx[i];
      int ny = y + dy[i];
      if (out(nx, ny))
        continue;
      if (c[nx][ny] == '#')
        continue;
      if (visit[nx][ny])
        continue;
      que[--l] = mp(mp(nx, ny), cost);
    }
    for (int scx = -1; scx <= 1; scx += 2) {
      for (int scy = -1; scy <= 1; scy += 2) {
        for (int d1 = 0; d1 < 3; d1++) {
          for (int d2 = 0; d2 < 3; d2++) {
            int nx = x + scx * d1;
            int ny = y + scy * d2;
            if (out(nx, ny))
              continue;
            if (c[nx][ny] == '#')
              continue;
            if (visit[nx][ny])
              continue;
            que[r++] = mp(mp(nx, ny), cost + 1);
          }
        }
      }
    }
  }
  cout << -1 << endl;
  return 0;
}