Cerința
Zoli și D’Umbră s-au pierdut într-un labirint cu n x n
camere dispuse pe cate n
linii și n
coloane. D’umbră se află în camera (1, 1)
, iar Zoli se află în camera (n, n)
. Aceștia vor trebui să parcurgă labirintul pentru a se regăsi. Dacă unul dintre ei se aflâ în camera (i, j)
, acesta se poate deplasa spre una din camerele aflate la pozițiile (i + 1, j)
, (i, j + 1)
, (i - 1, j)
sau (i, j - 1)
, fără a părăsi labirintul.
Camerele nu pot fi accesate ușor. La fiecare cameră se află câte o ușă având o rezistență R
care poate fi spartă cu un baros cu o putere P ≥ R
. Unul dintre cei doi (nu contează care) va avea acces la un arsenal de barosuri cu puteri între 0
și 100.000
.
Determinați puterea minimă pe care o poate avea barosul ce trebuie folosit astfel încât Zoli și D’Umbră să se poată întâlni.
Date de intrare
Fișierul de intrare labirint.in
conține pe prima linie numărul n
, iar pe următoarele n
linii n
numere, al j
-lea număr de pe linia i + 1
reprezintă rezistența ușii de la camera aflată în (i, j)
.
Date de ieșire
Fișierul de ieșire labirint.out
va conține pe prima linie numărul Pmin
, reprezentând puterea minimă pe care o poate avea un baros folosit pentru a sparge anumite uși și a conecta camerele (1, 1)
și (n, n)
.
Restricții și precizări
1 ≤ n ≤ 1.000
0 ≤
rezistența unei uși≤ 100.000
- pentru
50%
din punctaj,Pmin ≤ 600
șin ≤ 500
Exemplu
labirint.in
4 1 2 3 4 2 3 1 4 2 1 2 3 3 3 1 1
labirint.out
2
Explicație
(1, 1) -> (2, 1) -> (3, 1) -> (3, 2) -> (3, 3) -> (4, 3) -> (4, 4)
Se evită camerele cu rezistență mai mare decât 2
.
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 Labirint:
#include <fstream>
#include <queue>
using namespace std;
ifstream fin ("labirint.in");
ofstream fout ("labirint.out");
const int N = 1005;
const int dx[] = {-1, 0, 1, 0},
dy[] = {0, 1, 0, -1};
int a[N][N], v[N][N], n, sol, step = 1 << 16;
queue <pair <int, int> > Q;
int lee(int k) {
for (int i = 1; i <= n; ++i)
for (int j = 1; j <= n; ++j)
v[i][j] = 0;
if (a[1][1] <= k)
Q.push(make_pair (1, 1));
else
return 0;
while (Q.size() && !v[n][n]) {
int x = Q.front().first;
int y = Q.front().second;
Q.pop();
for (int crt = 0; crt < 4; ++crt) {
int xx = x + dx[crt];
int yy = y + dy[crt];
if (!v[xx][yy] && a[xx][yy] <= k) {
v[xx][yy] = 1;
Q.push(make_pair (xx, yy));
}
}
}
while (Q.size())
Q.pop();
return v[n][n];
}
int main() {
fin >> n;
for (int i = 1; i <= n; ++i)
for (int j = 1; j <= n; ++j)
fin >> a[i][j];
for (int i = 0; i <= n + 1; ++i)
for (int j = 0; j <= n + 1; ++j)
v[i][j] = 1;
for (; step; step >>= 1)
if (!lee(sol + step))
sol += step;
fout << sol + 1;
}
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 #1238 Labirint
Pe această pagină găsești rezolvarea de 100 de puncte pentru problema #1238 Labirint 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!