1238 - Labirint: Difference between revisions
Pagină nouă: = Cerința = Zoli și D’Umbră s-au pierdut într-un labirint cu <code>n x n</code> camere dispuse pe cate <code>n</code> linii și <code>n</code> coloane. D’umbră se află în camera <code>(1, 1)</code>, iar Zoli se află în camera <code>(n, n)</code>. Aceștia vor trebui să parcurgă labirintul pentru a se regăsi. Dacă unul dintre ei se aflâ în camera <code>(i, j)</code>, acesta se poate deplasa spre una din camerele aflate la pozițiile <code>(i + 1, j)</code>,... |
|||
Line 40: | Line 40: | ||
import queue | import queue | ||
fin = open("labirint. | fin = open("labirint.in", "r") | ||
fout = open("labirint. | fout = open("labirint.out", "w") | ||
N = 1005 | N = 1005 | ||
dx = [-1, 0, 1, 0] | dx = [-1, 0, 1, 0] |
Latest revision as of 16:09, 21 December 2023
Cerința[edit | edit source]
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[edit | edit source]
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[edit | edit source]
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[edit | edit source]
1 ≤ n ≤ 1.000
0 ≤
rezistența unei uși≤ 100.000
- pentru
50%
din punctaj,Pmin ≤ 600
șin ≤ 500
Exemplu:[edit | edit source]
labirint.in
4 1 2 3 4 2 3 1 4 2 1 2 3 3 3 1 1
labirint.out
2
Explicație[edit | edit source]
(1, 1) -> (2, 1) -> (3, 1) -> (3, 2) -> (3, 3) -> (4, 3) -> (4, 4)
Se evită camerele cu rezistență mai mare decât 2
.
Încărcare soluție[edit | edit source]
Lipește codul aici[edit | edit source]
<syntaxhighlight lang="python" line="1"> import queue
fin = open("labirint.in", "r") fout = open("labirint.out", "w") N = 1005 dx = [-1, 0, 1, 0] dy = [0, 1, 0, -1] a = [[0] * N for _ in range(N)] v = [[0] * N for _ in range(N)] n = 0 sol = 0 step = 1 << 16 Q = queue.Queue()
def lee(k):
global Q global v global n global a for i in range(1, n + 1): for j in range(1, n + 1): v[i][j] = 0 if a[1][1] <= k: Q.put((1, 1)) else: return 0 while not Q.empty() and not v[n][n]: x, y = Q.get() for crt in range(4): xx = x + dx[crt] yy = y + dy[crt] if not v[xx][yy] and a[xx][yy] <= k: v[xx][yy] = 1 Q.put((xx, yy)) while not Q.empty(): Q.get() return v[n][n]
n = int(fin.readline()) for i in range(1, n + 1):
a[i] = list(map(int, fin.readline().split()))
for i in range(n + 2):
for j in range(n + 2): v[i][j] = 1
while step:
if not lee(sol + step): sol += step step >>= 1
fout.write(str(sol + 1)) fin.close() fout.close()
</syntaxhighlight>