Rezolvare completă PbInfo #957 Zana

Castelul Zânei Spiriduşilor este construit pe o suprafaţă dreptunghiulară având n*m camere identice, de formă pătratică, dispuse câte m pe direcţia Ox şi câte n pe direcţia Oy ca în desenul de mai jos în care n=3 şi m=6. Din fiecare cameră se poate intra în orice cameră învecinată, cameră care are un perete comun cu acesta. Fiecare cameră este identificată prin coordonatele sale, ca în figură.

În castel, trăiesc k spiriduşi împreună cu Zâna lor. Fiind în curând aniversarea zilei de naştere a Zânei, fiecare spiriduş a pregătit câte un cadou pe care îl ascunde, nevăzut de ceilalţi, într-una din camerele castelului. Tradiţia acestei sărbătoriri, impune următoarele reguli:

  1. În căutarea cadourilor, Zâna porneşte din camera de coordonate (1,1). Ea se deplasează prin camerele castelului cât timp în aceste camere nu se află niciun cadou.
  2. Căutarea se încheie în momentul în care Zâna intră într-o cameră în care se află cel puţin un cadou. Zână va primi toate cadourile aflate în acestă cameră, restul cadourilor vor dispărea.

Cerinţă

Scrieţi un program care să citească din fişierul zana.in numerele naturale n, m, k şi cele k coordonatele ale camerelor în care spiriduşii au ascuns cadourile, şi care să determine:

a) numărul n1 maxim de cadouri pe care le poate primi Zâna în urma respectării regulilor;
b) numărului n2 al camerelor în care poate ajunge Zâna respectând regulile, camere ce conţin fiecare câte n1 cadouri.

Date de intrare

Fișierul de intrare zana.in conţine pe prima linie cele trei numere naturale: n m k, separate prin câte un spaţiu. Pe fiecare din următoarele k linii, câte una pentru fiecare spiriduş, sunt scrise câte două numere naturale: i j, separate printr-un spaţiu, reprezentând coordonatele camerei în care spiriduşul curent a ascuns cadoul.

Date de ieșire

Fișierul de ieșire zana.out va conține două linii. Pe prima linie se va scrie numărul natural n1 reprezentând numărul maxim de cadouri pe care le poate primi Zâna. Pe cea de-a doua linie se va scrie numărul natural n2, reprezentând numărul camerelor în care poate ajunge Zâna şi care conţin fiecare câte n1 cadouri.

Restricții și precizări

  • 1≤n≤180, 1≤n≤180, 1≤k≤30000
  • 1≤i≤n, 1≤j≤m
  • toate valorile din fișierul de intrare sunt numere naturale

Exemplu

zana.in

3 5 11
1 5
1 5
1 3
1 3
1 4
1 4
1 4
2 4
2 4
2 5
3 2

zana.out

2
2

Explicație

Castelul are 3*5=15 camere. Coordonatele acestora sunt cele din figura 1, iar cadourile sunt dispuse ca în figura următoare:

Zâna porneşte căutarea începând din camera de coordonate (1,1). Camera cu număr maxim de cadouri (3) are coordonatele (1,4), dar zâna nu poate ajunge în acestă cameră, deoarece pentru a ajunge în acesta ea trebuie să treacă prin una din camerele de coordonate (1,3), (2,4), (2,5) în care se află cadouri. Conform regulamentului, căutarea se va încheia în una din aceste camere. Astfel zâna poate parcurge camerele (1,1), (1,2), (1,3) sau (1,1), (1,2), (2,2), (2,3), (2,4), etc pentru a ajunge într-una din cele n2=2 camere cu număr n1=2 maxim de cadouri.

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

#include <fstream>
#define nmax 105
#define mmax 105
using namespace std;

ifstream f("zana.in");
ofstream g("zana.out");

int a[nmax][mmax], b[nmax][mmax];
int n, m, k, n1=0, n2=0;


void citire()
{
    f >> n >> m >> k;
    int i, j, p;
    for(p = 1; p <=k; p++)
    {
        f >> i >> j;
        a[i][j] ++;
    }
    f.close();
}

void fill(int i, int j, int v)
{
    if(b[i][j]==0)
    {
        b[i][j]=v;
        if(a[i][j]>n1)
        {
            n1=a[i][j];
            n2=1;
        }
        else
        {
            if(a[i][j]==n1)
                n2++;
        }
        if(a[i][j]==0)
        {
            if(a[i][j+1]>=0)
                fill(i,j+1,v+1);
            if(a[i][j-1]>=0)
                fill(i,j-1,v+1);
            if(a[i-1][j]>=0)
                fill(i-1,j,v+1);
            if(a[i+1][j]>=0)
                fill(i+1,j,v+1);
        }
    }
}

int main()
{
    citire();
    int i;
    for(i=0;i<=n+1;i++)
        a[i][0]=a[i][m+1]=-1;
    for(i=0;i<=m+1;i++)
        a[0][i]=a[n+1][i]=-1;
    for(i=0;i<=n+1;i++)
        b[i][0]=b[i][m+1]=-1;
    for(i=0;i<=m+1;i++)
        b[0][i]=b[n+1][i]=-1;
    fill(1,1,1);
    g << n1 << endl << n2 << endl;
    g.close();
    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 #957 Zana

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