Cerința
Se dă o matrice cu n
linii și m
coloane și elemente 0
sau 1
, reprezentând planul unui teren în care 0
reprezintă o zonă accesibilă, iar 1
reprezintă o zonă inaccesibilă. O zonă a terenului are ca și coordonate linia și coloana corespunzătoare din matrice. Într-o zonă cunoscută a matricei se află un robot, iar în altă zonă, de asemenea cunoscută, se află o roboțică. Determinați numărul minim de pași prin care robotul va ajunge la roboțică. Dacă nu este posibil ca robotul să ajungă la roboțică, rezultatul va fi -1
.
Date de intrare
Fișierul de intrare roboti.in
conține pe prima linie numerele n m
. Următoarele n
linii conțin câte m
valori, 0
sau 1
. Următoarele două linii conțin câte două valori, reprezentând coordonatele robotului, respectiv ale roboțicii.
Date de ieșire
Fișierul de ieșire roboti.out
va conține pe prima linie valoarea cerută.
Restricții și precizări
1 ≤ n , m ≤ 1000
- zonele pe care se află inițial cei doi roboți sunt libere și sunt diferite
- un pas reprezintă trecerea robotului din zona curentă într-o zonă vecină cu aceasta pe linie sau pe coloană, fără a părăsi matricea.
Exemplu
roboti.in
4 5 1 0 0 0 1 0 0 1 0 0 0 0 0 0 1 1 1 0 0 1 1 2 2 5
roboti.out
4
Explicație
Un traseu al robotului format din 4
pași este evidențiat mai jos.
1 | 0 | 0 | 0 | 1 |
0 | 0 | 1 | 0 | 0 |
0 | 0 | 0 | 0 | 1 |
1 | 1 | 0 | 0 | 1 |
Există și alte trasee posibile, dar lungimea lor este mai mare.
#include <bits/stdc++.h> using namespace std; ifstream cin("roboti.in"); ofstream cout("roboti.out"); const int di[]={-1 , 0 , 1 , 0}; const int dj[]={0 , 1 , 0 , -1}; int n , m , a[1002][1002] , x[1000001] , y[1000001]; int ip , jp , is , js;///coordonatele bool inside(int i , int j) { return i>=1 && i<=n && j>=1 && j<=m; } int main() { ///citire cin >> n >> m; for(int i = 1 ; i <=n ; ++i) { for(int j = 1 ; j <=m ; ++j) cin >> a[i][j]; } cin >> ip >> jp >> is >> js; ///LEE int st = 1 , dr = 1;///capetele cozii a[ip][jp] = 1;///pornirea x[1]=ip; y[1]=jp; while(st <= dr && a[is][js]==0) { int i= x[st] , j = y[st];///poz curenta for(int k = 0 ; k < 4 ; k++) { ///caculam pozitiie urmatoare int ii = i+di[k]; int jj = j+dj[k]; if(inside(ii , jj) && a[ii][jj]==0) { dr++;///crestem coada x[dr]=ii; y[dr]=jj; a[ii][jj]=a[i][j]+1;///cu 1 mai departe } } st++;///avans in coada } cout << a[is][js]-1; return 0; }