Rezolvare completă PbInfo #3346 pestelee

Î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

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 pestelee:

///Ispir Alexandru - 100p
#include <fstream>

#define DIM 500

using namespace std;

ifstream fin("pestelee.in");
ofstream fout("pestelee.out");

int m,n,x1,y1,x2,y2,c;
int a[DIM+5][DIM+5];
long long int b[DIM+5][DIM+5];

struct coada
{
    int x,y;
}C[DIM*DIM+5];

void bordare()
{
    for(int i=0;i<=m+1;i++)
        a[i][0]=a[i][n+1]=-1;
    for(int j=0;j<=n+1;j++)
        a[0][j]=a[m+1][j]=-1;
    return;
}

void lee()
{
    int i,lim=1;
    C[lim].x=x1;
    C[lim].y=y1;
    a[C[lim].x][C[lim].y]=1;
    b[C[lim].x][C[lim].y]=1;
    for(i=1;i<=lim && (C[i].x!=x2 || C[i].y!=y2);i++)
    {
        if(a[C[i].x+1][C[i].y]==0)
        {
            C[++lim].x=C[i].x+1,C[lim].y=C[i].y;
            a[C[i].x+1][C[i].y]=a[C[i].x][C[i].y]+1;
            b[C[i].x+1][C[i].y]=b[C[i].x+2][C[i].y]+b[C[i].x+1][C[i].y+1]+b[C[i].x+1][C[i].y-1]+b[C[i].x][C[i].y];
            b[C[i].x+1][C[i].y]%=10007;
        }
        if(a[C[i].x][C[i].y+1]==0)
        {
            C[++lim].x=C[i].x,C[lim].y=C[i].y+1;
            a[C[i].x][C[i].y+1]=a[C[i].x][C[i].y]+1;
            b[C[i].x][C[i].y+1]=b[C[i].x+1][C[i].y+1]+b[C[i].x-1][C[i].y+1]+b[C[i].x][C[i].y]+b[C[i].x][C[i].y+2];
            b[C[i].x][C[i].y+1]%=10007;
        }
        if(a[C[i].x-1][C[i].y]==0)
        {
            C[++lim].x=C[i].x-1,C[lim].y=C[i].y;
            a[C[i].x-1][C[i].y]=a[C[i].x][C[i].y]+1;
            b[C[i].x-1][C[i].y]=b[C[i].x-2][C[i].y]+b[C[i].x][C[i].y]+b[C[i].x-1][C[i].y-1]+b[C[i].x-1][C[i].y+1];
            b[C[i].x-1][C[i].y]%=10007;
        }
        if(a[C[i].x][C[i].y-1]==0)
        {
            C[++lim].x=C[i].x,C[lim].y=C[i].y-1;
            a[C[i].x][C[i].y-1]=a[C[i].x][C[i].y]+1;
            b[C[i].x][C[i].y-1]=b[C[i].x+1][C[i].y-1]+b[C[i].x-1][C[i].y-1]+b[C[i].x][C[i].y-2]+b[C[i].x][C[i].y];
            b[C[i].x][C[i].y-1]%=10007;
        }
    }
    if(a[x2][y2]==0)
        fout<<"0";
    else
        if(c==1)
            fout<<a[x2][y2];
        else
            fout<<b[x2][y2]%10007;
    return;
}

int main()
{
    fin>>m>>n;
    for(int i=1;i<=m;i++)
    {
        for(int j=1;j<=n;j++)
        {
            fin>>a[i][j];
            if(a[i][j]==1)
                a[i][j]=-1;
        }
    }
    fin>>x1>>y1>>x2>>y2;
    fin>>c;
    bordare();
    lee();
    ///for(int i=1;i<=m;i++)
    ///{
        ///for(int j=1;j<=n;j++)
        ///{
            ///fout<<a[i][j]<<" ";
        ///}
        ///fout<<"\n";
    ///}
    return 0;
}

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 Adresa de email.

Rezolvarea problemei #3346 pestelee

Pe această pagină găsești rezolvarea de 100 de puncte pentru problema #3346 pestelee 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!