În arhipelagul X
(reprezentat sub forma unei matrici binare cu m
linii și n
coloane, acesta având m*n
zone acoperite de apă (codificate prin 0
) sau uscat (codificate prin 1
)), ajunge un peşte de aur. După drumul obositor parcurs de peşte, el vrea să se relaxeze într-o anumită zonă din acest arhipelag (cu coordonatele x2
, y2
). Totodată, acest peşte este curios să afle câte modalităţi sunt ca să ajungă acolo.
Cerința
Ştiind că peştele porneşte din coordonatele x1
, y1
, să se determine:
În arhipelagul X
(reprezentat sub forma unei matrici binare cu m
linii și n
coloane, acesta având m*n
zone acoperite de apă (codificate prin 0
) sau uscat (codificate prin 1
)), ajunge un peşte de aur. După drumul obositor parcurs de peşte, el vrea să se relaxeze într-o anumită zonă din acest arhipelag (cu coordonatele x2
, y2
). Totodată, acest peşte este curios să afle câte modalităţi sunt ca să ajungă acolo.
Cerința
Ştiind că peştele porneşte din coordonatele x1
, y1
, să se determine:
1) Lungimea celui mai rapid drum până în zona preferată de peşte.
2) Numărul de modalităţi eficiente de a ajunge la coordonatele x2
, y2
modulo 10007
.
Date de intrare
In fişierul de intrare pestelee.in
se vor citi:
Pe prima linie: m
şi n
(dimensiunile arhipelagului)
Pe următoarele m
linii: n
numere binare (adică 0
sau 1
).
Pe penultima linie: x1
, y1
, x2
, y2
.
Pe ultima linie: c
, semnificând numărul cerinţei.
Date de ieșire
În fişierul de ieşire pestelee.out
se va afișa răspunsul la cerința c
.
Restricții și precizări
1 ≤ x1, x2 ≤ m ≤ 500
1 ≤ y1, y2 ≤ n ≤ 500
1 ≤ c ≤ 2
- Peştele va putea merge doar în
4
direcţii (Nord, Est, Sud, Vest). De asemenea, acesta nu poate părăsi arhipelagul sau să se deplaseze pe uscat. - Zona de început, respectiv cea de sfârşit vor fi acoperite de apă.
- Dacă peştele nu va putea ajunge în zona preferată, se va afişa
0
. - Pentru 67 de puncte,
c=2
. - Pentru 10 puncte sunt exemplele.
Exemplul 1:
pestelee.in
5 5 1 0 0 0 1 1 0 1 0 1 1 1 0 0 1 1 1 0 0 1 1 1 1 1 1 2 2 3 3 1
pestelee.out
7
Exemplul 2:
pestelee.in
5 5 1 0 0 0 1 1 0 1 0 1 1 1 0 0 1 1 1 0 0 1 1 1 1 1 1 2 2 4 3 2
pestelee.out
2
#include <bits/stdc++.h> using namespace std; ifstream cin("pestelee.in"); ofstream cout("pestelee.out"); #define mod 10007 const int di[] = {-1 , 1 , 0 , 0}; const int dj[] = {0 , 0 , -1 , 1}; struct poz { int i , j; }; int cer , n , m , a[501][501] , x1 , y1 , x2 , y2 , b[501][501] , d[501][501]; bool inside(int i , int j) { return i >= 1 && i <= n && j >= 1 && j <= m; } void lee(int i , int j) { queue <poz> Q; Q.push({i , j}); b[i][j] = 1; d[i][j] = 1; while(!Q.empty()) { poz x; x = Q.front(); for(int i = 0 ; i < 4 ; i++) { int inou = x.i + di[i]; int jnou = x.j + dj[i]; if(inside(inou , jnou) && b[inou][jnou] == 0 && a[inou][jnou] == 0) { Q.push({inou , jnou}); b[inou][jnou] = b[x.i][x.j] + 1; d[inou][jnou] = (d[inou - 1][jnou] % mod + d[inou][jnou - 1] % mod + d[inou + 1][jnou] % mod + d[inou][jnou + 1] % mod) % mod; } } 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]; cin >> x1 >> y1 >> x2 >> y2; cin >> cer; lee(x1 , y1); if(cer == 1) cout << b[x2][y2]; else cout << d[x2][y2]; }