fbpx

Problema #3346 – pestelee – Rezolvari PBInfo

de Mihai-Alexandru

Î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];
}
Comentarii

S-ar putea sa iti placa