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.
Cum e corect?
cout < "As la info";
cout << "As la info";
cout >> "As la info";
Felicitări! Poți mai mult?
Avem sute de probleme pentru tine, fiecare cu explicații ușor de înțeles.
Greșit, dar nu-i bai!
Antrenează-te cu sutele de probleme pe care ți le-am pregătit. Îți explicăm fiecare problemă în parte.
Rezolvare
Iată rezolvarea de 100 de puncte pentru problema Roboti:
#include <iostream>
#include <fstream>
#include <cassert>
using namespace std;
ifstream fin("roboti.in");
ofstream fout("roboti.out");
int n , m;
int a[1002][1002];
short x[1000005], y[1000005];
int x1 , y1 , x2 , y2;
const int dx[]={0 , 0 , 1 , -1}, dy[]={1 , -1 , 0 , 0};
int main(){
fin >> n >> m;
for(int i = 1 ; i <= n ; i ++)
for(int j = 1 ; j <= m ; j ++)
fin >> a[i][j];
assert(fin >> x1 >> y1 >> x2 >> y2);
assert(a[x1][y1] == 0);
assert(a[x2][y2] == 0);
fin.close();
//facem obstacolele -1
for(int i = 1 ; i <= n ; i ++)
for(int j = 1 ; j <= m ; j ++)
a[i][j] = - a[i][j];
//bordare cu -1, ca sa nu iesim din matrice
for(int i = 0 ; i <= n + 1 ; i ++)
a[i][0] = a[i][m+1] = -1;
for(int j = 0 ; j <= m + 1; j ++)
a[0][j] = a[n+1][j] = -1;
int st , dr;
st = dr = 1;
x[dr] = x1, y[dr] = y1;
a[x1][y1] = 1;
while(st <= dr)
{
int i = x[st], j = y[st];
//cerr << i << " " << j << endl;
for(int k = 0 ; k < 4 ; k ++)
{
int ii = i + dx[k], jj = j + dy[k];
if(a[ii][jj] == 0)
{
a[ii][jj] = a[i][j] + 1;
dr ++;
x[dr] = ii, y[dr] = jj;
}
}
st ++;
}
/*
for(int i = 1 ; i <= n ; i ++)
{
for(int j = 1 ; j <= m ; j ++)
cerr << a[i][j] << " " ;
cerr << endl;
}
*/
if(a[x2][y2] == 0)
fout << -1;
else
fout << a[x2][y2] - 1;
fout.close();
return 0;
}
Atenție
Enunțurile afișate pe această pagină aparțin exclusiv site-ului PbInfo. Astfel, pentru ștergerea conținutului, puteți să ne contactați la adresa .
Rezolvarea problemei #864 Roboti
Pe această pagină găsești rezolvarea de 100 de puncte pentru problema #864 Roboti de pe PbInfo.ro. Atenție: nu încurajăm copiatul codului! Totuși, credem cu tărie că analizarea unei soluții corecte este o metodă foarte ușoară de a învăța informatică, astfel că oferim sursele pentru peste 1500 de probleme de pe platforma PbInfo.ro.
Pentru rezolvări PbInfo de la peste 1500 de probleme, vă invităm să intrați pe site-ul nostru!