@{c++}#include <fstream>
#include <queue> // coada din stl
using namespace std;
ifstream fin(“roboti.in”);
ofstream fout(“roboti.out”);
const int di[] = {-1, 0, 1, 0}; /// vectorul directie pt i
const int dj[] = {0, 1, 0, -1}; /// vectorul directie pt j
struct pozitie {int i, j;};
int A;
int B;
int n, m, i1, j1, i2, j2;
queue<pozitie> Q;
/// verifica sa nu iesim din matrice
int inside(int i, int j)
{
return i >= 1 && i <= n && j >= 1 && j <= m;
}
void LEE
{
B[i][j] = 1; /// marchez in B pozitia de pornire
Q.push({i, j}); /// adaug in Q pozitia
while(!Q.empty()) /// cat timp mai sunt pozitii in Q
{
/// luam pozitia din fata cozii
i = Q.front().i;
j = Q.front().j;
Q.pop(); /// elimina elementul din fata cozii
for(int d = 0; d < 4; d++)
{
int iv = i + di[d], jv = j + dj[d]; /// calculeaza coordonatele vecinului
if(inside(iv, jv) && A[iv][jv]==0 && B[iv][jv] == 0)
{
/// daca pozitia este accesibila si nu am mai trecut pe acolo
B[iv][jv] = B[i][j]+1; /// cu un pas in plus
Q.push({iv, jv}); /// adauga in Q pozitia noua
}
}
}
}
int main()
{
fin >> n >> m;
for(int i = 1; i <= n; i++)
for(int j = 1; j <= m; j++)
fin >> A[i][j];
fin >> i1 >> j1 >> i2 >> j2;
LEE;
if(B[i2][j2] == 0)
fout << -1;
else
fout << B[i2][j2]-1;
return 0;
}@