Cerința
Rică se joacă în fiecare seară The MazeRunnerVladVersion, joc pe care îl vom numi pentru simplitatea problemei MR. Jocul constă în găsirea unei căi de scăpare dintr-un labirint care conține:
- ziduri prin care Rică nu va putea să treacă;
- zero sau mai multe teleporturi cu ajutorul cărora deplasarea între două puncte precizate
p1(x1, y1)șip2(x2, y2)se face într-un minut, dacă se doreşte acest lucru; - zone libere, trecerea din zona curentă într-o zonă învecinată se poate face pe direcția celor patru puncte cardinale. Deplasarea se va face într-un minut.
Rică pleacă din colțul stânga-sus al labirintului și doreşte să ajungă în colțul dreapta-jos.
El știe că are o teză în ziua următoare, așa că vă cere ajutorul vouă, programatorilor, și vă roagă să aflați timpul minim în care poate să ajungă din colțul stânga-sus în colțul dreapta-jos al labirintului.
Date de intrare
Fișierul de intrare mr.in conține:
- numărul
Lde linii și numărulCde coloane pentru harta labirintului, separate printr-un spațiu - pe următoarele
Llinii se vor găsiCvalori de-1(reprezentând zid) sau0separate printr-un spațiu - pe linia
L+2se va găsi numărul de teleporturiT - pe fiecare dintre următoarele
Tlinii se vor găsi câte patru numere de forma:L1 C1 L2 C2separate printr-un spațiu, reprezentând poziţiile de pe hartă ale teleporturilor. Rică poate să aleagă să se teleporteze din pozițiaL1 C1în pozițiaL2 C2.
Date de ieșire
Fișierul de ieșire mr.out va conține pe prima linie timpul minim necesar lui Rică pentru a parcurge labirintul.
Restricții și precizări
2 ≤ n, m ≤ 1000 ≤ T ≤ 100- Pentru fiecare set de date de intrare există soluție.
- Pentru 50% din teste nu există teleporturi.
Exemplul 1
mr.in
5 5 0 0 -1 0 0 0 -1 0 0 0 0 0 0 0 0 -1 -1 0 0 0 0 0 0 0 0 0
mr.out
8
Explicație
Un drum minim posibil este:
(1, 1) → (2, 1) → (3, 1) → (3, 2) → (3, 3) → (4, 3) → (5, 3) → (5, 4) → (5, 5)
Exemplul 2
mr.in
5 6 0 0 0 0 -1 0 0 0 -1 -1 0 0 -1 0 0 0 -1 0 -1 0 -1 0 0 0 -1 -1 -1 0 0 0 2 2 2 4 5 4 2 2 5
mr.out
5
Explicație
Un drum minim posibil este:
(1, 1) → (1, 2) → (2, 2) → (4, 5) → (4, 6) → (5, 6).
Între pozițiile (2,2) și (4,5) s-a utilizat primul teleport.
#include <bits/stdc++.h>
using namespace std;
ifstream cin("mr.in");
ofstream cout("mr.out");
const int di[] = {0 , 0 , -1 , 1};
const int dj[] = {-1 , 1 , 0 , 0};
int n , m , t , x1 , y1 , x2 , y2 , b[101][101];
struct poz
{
int i , j;
};
struct per
{
int it , jt , nr;
}a[101][101];
queue <poz> q;
int inside(int i , int j)
{
return i >= 1 && i <= n && j >= 1 && j <= m;
}
void lee()
{
poz r;
r.i = 1 , r.j = 1;
b[r.i][r.j] = 1;
q.push(r);
while(!q.empty())
{
poz r;
r = q.front();
if(a[r.i][r.j].it)
{
int inou = a[r.i][r.j].it;
int jnou = a[r.i][r.j].jt;
if(a[inou][jnou].nr != -1 && (b[inou][jnou] > b[r.i][r.j] + 1 || b[inou][jnou] == 0))
{
b[inou][jnou] = b[r.i][r.j] + 1;
q.push({inou , jnou});
}
}
for(int d = 0 ; d < 4 ; d++)
{
int inou = r.i + di[d];
int jnou = r.j + dj[d];
if(inside(inou , jnou) && a[inou][jnou].nr != -1 && b[inou][jnou] == 0)
{
b[inou][jnou] = b[r.i][r.j] + 1;
q.push({inou , jnou});
}
}
q.pop();
}
}
int main()
{
cin >> n >> m;
for(int i = 1 ; i <= n ; i++)
for(int j = 1 ; j <= m ; j++)
cin >> a[i][j].nr;
cin >> t;
for(int i = 0 ; i < t ; i++)
{
cin >> x1 >> y1 >> x2 >> y2;
a[x1][y1].it = x2;
a[x1][y1].jt = y2;
a[x2][y2].it = x1;
a[x2][y2].jt = y1;
}
lee();
cout << b[n][m] - 1;
}