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
L
de linii și numărulC
de coloane pentru harta labirintului, separate printr-un spațiu - pe următoarele
L
linii se vor găsiC
valori de-1
(reprezentând zid) sau0
separate printr-un spațiu - pe linia
L+2
se va găsi numărul de teleporturiT
- pe fiecare dintre următoarele
T
linii se vor găsi câte patru numere de forma:L1 C1 L2 C2
separate 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 ≤ 100
0 ≤ 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; }