Rezolvare completă PbInfo #954 joc2

Plictisiți de Facebook și jocuri online, Diana și Jonny s-au gândit să joace un joc nou, care să necesite și mișcare în aer liber. Astfel, cei doi au desenat pe terenul de sport din liceu un dreptunghi pe care l-au împărțit cu N-1 linii orizontale și M-1 linii verticale în NxM pătrate identice, așezate pe N rânduri și M coloane, câte N pe fiecare rând și câte M pe fiecare coloană, ca în exemplu. Apoi, în interiorul fiecărui pătrat au scris câte un număr reprezentând valoarea pătratului respectiv în joc. După ce au terminat de scris cele NxM numere, Diana și Jonny au stabilit ca jocul să se desfășoare după următoarele reguli:

  • Diana se poziționează în pătratul din colțul stânga-sus al dreptunghiului, iar Jonny se poziționează în pătratul din colțul dreapta-sus al dreptunghiului.
  • Din pătratul în care se află, Diana se va deplasa făcând un pas în pătratul din dreapta de pe aceeași linie (dacă există) sau în pătratul situat pe linia următoare în aceeași coloană (dacă există), ca în desenul de mai jos.
  • Din pătratul în care se află, Jonny se va deplasa făcând un pas în pătratul din stânga de pe aceeași linie (dacă există) sau în pătratul situat pe linia următoare în aceeași coloană (dacă există), ca în desenul alăturat.
  • Ambii concurenți vor face până la finalul jocului un număr egal de pași. Simultan, fiecare se va deplasa din pătratul curent în cel ales cu respectarea regulilor de mai sus. Concurenții se pot afla la un moment dat în același pătrat.
  • Jocul se încheie în momentul în care Diana ajunge în pătratul din colțul dreapta-jos al dreptunghiului, iar Jonny ajunge în pătratul din colțul stânga-jos al dreptunghiului.
  • Fiecare concurent alege pătratele prin care să se deplaseze conform regulilor de mai sus astfel încât să obțină suma maximă posibilă a valorilor din pătratele alese. Această sumă va reprezenta punctajul concurentului.
  • Câștigă jocul concurentul care obține punctajul cel mai mare la finalul jocului. Dacă cei doi concurenți obțin același punctaj, atunci amândoi vor câștiga jocul.

Cerință

Scrieți un program care să citească numerele N, M, cele NxM valori ale pătratelor din dreptunghi și care să determine câștigătorul jocului, precum și punctajul obținut de acesta la finalul jocului.

Date de intrare

Fișierul de intrare joc2.in conține:

  • pe prima linie, cele două numere N și M separate printr-un spațiu;
  • pe fiecare din următoarele N linii, câte M numere separate printr-un spațiu, reprezentând valorile pătratelor din linia curentă din dreptunghi corespunzătoare liniei din fișier (linia k+1 din fișier corespunde pătratelor din rândul k al dreptunghiului, pentru k=1,2,…,N), în ordinea lor din linie, de la stânga la dreapta.

Date de ieșire

Fișierul de ieșire joc2.out va conține pe prima linie două numere C și P, separate printr-un spațiu, C având valoarea 1 dacă Diana câștigă, 2 dacă Jonny câștigă sau 3 dacă ambii câștigă, iar P reprezentând punctajul obținut de către câștigător.

Restricții și precizări

  • 1 ≤ N ≤ 100, 1 ≤ M ≤ 100, N și M sunt numere naturale;
    valorile pătratelor sunt numere naturale nenule strict mai mici decât 100.

Exemplu

joc2.in

5 4
90 25 70 33
32 40 50 20
43 80 55 70
22 27 40 21
80 45 78 34

joc2.out

1 452

Explicație

La finalul jocului, punctajul Dianei este 452, iar punctajul lui Jonny este 451. Câștigătorul jocului este Diana (:D). Astfel, fișierul de ieșire va conține pe prima linie numerele: 1 452. Trasee posibile de punctaj maxim pentru cei doi concurenți sunt următoarele:

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

#include <iostream>
#include <fstream>
using namespace std;
ifstream f ("joc2.in");
ofstream g ("joc2.out");
int n, m, d[105][105], a[105][105], v[105][105];
void citire ()
{
    f>>n>>m;
    for (int i=1; i<=n; i++) for (int j=1; j<=m; j++) f>>v[i][j];
    // for (int i=1; i<=n; i++){ for (int j=1; j<=m; j++) cout<<v[i][j]<<; cout<<endl;}
}
void umplere1 ()
{
    d[1][1]=v[1][1];
    a[1][1]=v[1][m];
    for (int j=2; j<=m; j++)
    {
        d[1][j]=v[1][j]+d[1][j-1];
        a[1][j]=v[1][m-j+1]+a[1][j-1];
    }
    for (int j=2; j<=n; j++)
    {
        d[j][1]=v[j][1]+d[j-1][1];
        a[j][1]=v[j][m]+a[j-1][1];
    }
}
void rezolvare ()
{
    for (int i=2; i<=n; i++)
        for (int j=2; j<=m; j++)
        {
            if (a[i-1][j]>a[i][j-1]) a[i][j]=a[i-1][j]+v[i][m-j+1];
            else a[i][j]=a[i][j-1]+v[i][m-j+1];
            if (d[i-1][j]>d[i][j-1]) d[i][j]=d[i-1][j]+v[i][j];
            else d[i][j]=d[i][j-1]+v[i][j];
        }
       // for (int i=1; i<=n; i++){ for (int j=1; j<=m; j++) cout<<a[i][j]<<; cout<<endl;}
    if (d[n][m]>a[n][m]) g<<1<<<<d[n][m];
    else if (d[n][m]<a[n][m]) g<<2<<<<a[n][m];
    else g<<3<<<<d[n][m];
    g<<endl;
}
int main ()
{
    citire ();
    umplere1 ();
    rezolvare ();
}

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 #954 joc2

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