Rezolvare completă PbInfo #1039 Betasah

Jocul betaşah se joacă folosindu-se doar piese asemănătoare damelor clasicului şah, numite tot dame. Suprafaţa de joc are o formă triunghiulară şi este formată din N*(N+1)/2 pătrate identice dispuse pe N rânduri şi N coloane. Rândurile se numerotează de sus în jos, de la 1 la N. Coloanele se numerotează de la stânga la dreapta, de la 1 la N. Primul rând conţine un singur pătrat, al doilea rând conţine două pătrate alăturate,…, al N-lea rând conţine N pătrate alăturate, ca în suprafeţele de joc cu N=6 din figurile de mai jos. Din cele N*(N+1)/2 pătrate, K sunt gri, iar restul sunt albe. Poziţia fiecărui pătrat de pe suprafaţa de joc este dată de rândul şi coloana în care acesta este situat.

Pe suprafaţa de joc sunt aşezate D dame în D pătrate albe distincte, ocupându-le. Într-un pătrat alb poate fi aşezată o singură damă, iar într-un pătrat gri nu poate fi aşezată nicio damă. Poziţia unei dame pe suprafaţa de joc este dată de poziţia pătratului alb în care este aşezată dama.

Damele pot accesa orice pătrat alb neocupat situat pe direcţiile: verticală, orizontală sau diagonală, numerotate de la 1 la 8 în figura b). Accesul pe o direcţie se face trecând din pătrat alb în pătrat alb (doar pătrate albe neocupate) până la întâlnirea unui pătrat gri sau a unui pătrat alb ocupat de o altă damă sau până la terminarea suprafeţei de joc.

Numim pătrat accesibil orice pătrat alb neocupat (de pe suprafaţa de joc) care ar putea fi accesat de cel puţin una din cele D dame.

De exemplu, pentru suprafaţa de joc din figura c) numărul de pătrate accesibile (marcate cu X) de pe suprafaţă este 11; pentru suprafaţa de joc cu N=6, D=3 şi K=4 din figura d) numărul de pătrate accesibile de pe suprafaţă este 13. În figura e) sunt marcate cu X pătratele accesibile fiecărei dame de pe suprafaţa de joc din figura d).

Pătratele accesibile damei din rândul 3 şi coloana 2 Pătratele accesibile damei din rândul 5 şi coloana 2 Pătratele accesibile damei din rândul 5 şi coloana 4 Pătratele accesibile de pe suprafaţa de joc
Figura e)

Cerințe

Scrieţi un program care să citească numerele naturale N, D, K, poziţiile damelor şi ale pătratelor gri pe suprafaţa de joc şi care să determine:
a) numărul maxim M de pătrate albe conţinute de un rând al suprafeţei de joc;
b) numărul P de pătrate accesibile de pe suprafaţa de joc.

Date de intrare

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

  • pe prima linie cele trei numere naturale N, D şi K, separate prin câte un spaţiu, cu semnificaţia din enunţ;
  • pe linia i+1 două numere naturale nenule xi şi yi, separate printr-un singur spaţiu, reprezentând poziţia damei i pe suprafaţa de joc (rândul xi şi coloana yi), pentru i=1,2,3,…,D;
  • pe linia D+1+j două numere naturale nenule zj şi tj, separate printr-un singur spaţiu, reprezentând poziţia pătratului gri j pe suprafaţa de joc (rândul zj şi coloana tj), pentru j=1,2,3,…,K.

Date de ieșire

Fișierul de ieșire betasah.out va conține pe prima linie numărul natural M şi pe a doua linie numărul natural P, cu semnificaţia din enunţ.

Restricții și precizări

  • 2 ≤ N ≤ 1000;
  • 1 ≤ D ≤ 100;
  • 1 ≤ K ≤ 50;
  • D + K ≤ N*(N+1)/2;
  • 1 ≤ yi ≤ xi ≤ N pentru i=1,2,3,...,D;
  • 1 ≤ tj ≤ zj ≤ N pentru j=1,2,3,...,K;
  • pentru rezolvarea corectă a cerinţei a) se acordă 20% din punctaj, iar pentru rezolvarea corectă a cerinţei b) se acordă 80% din punctaj.

Exemplu

betasah.in

6 3 4
3 2 
5 2
5 4
3 1
4 3
6 4
1 1

betasah.out

5
13

Explicație

N=6, D=3, K=4.
Rândurile 5 şi 6 conţin numărul maxim M=5 de pătrate albe.
Numărul de pătrate accesibile de pe suprafaţa de joc este P=13.

În desenul de mai sus corespunzător suprafeţei date, cele 13 pătrate accesibile sunt marcate cu X.

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

//prof. Carmen Minca
//Colegiul National de Informatica Tudor Vianu Bucuresti
#include <fstream>

using namespace std;
int n,d,k,pozdama[103][3], albe[1003];
char a[1003][1003];
ifstream f("betasah.in");
ofstream g("betasah.out");

int main()
{
    //citire date
    int i,l,c,j,i1;
    f>>n>>d>>k;
    for(i=1;i<=d;i++)
    {
        f>>l>>c;
        a[l][c]=1;//codific cu 1 pozitia damei din joc
        pozdama[i][1]=l;pozdama[i][2]=c;
    }
    for(i=1;i<=n;i++)albe[i]=i;
    for(i=1;i<=k;i++)
    {
        f>>l>>c;
        a[l][c]=2;//codific cu 2 patratele gri din joc
        albe[l]--;//scad patratele gri din nr total de patrate de pe linia l
    }
    int M=albe[1]; //a)
    for(i=2;i<=n;i++)M=max(albe[i],M);

    //bordare matrice. Incadrez suprafata de joc cu patrate gri
    //pentru a nu iesi din suprafata de joc
    for(i=0;i<=n+1;i++)
       a[i][0]=a[i][i+1]=a[i][i+2]=2;
    for(j=0;j<=n+2;j++)
       a[n+1][j]=2;
    //determin pentru fiecare dama patratele accesibile
    for(i=1;i<=d;i++)
    {
        l=pozdama[i][1]; c=pozdama[i][2];
        //pe aceeasi linie
        j=c-1;
            while(a[l][j]!=2)//directia 7
            {
               if(a[l][j]==0)a[l][j]=3;
               j--;
            }
            j=c+1;
            while(a[l][j]!=2)//directia 3
            {
                if(a[l][j]==0)a[l][j]=3;
                j++;
            }
        //pe aceeasi coloana
          i1=l-1;
            while(a[i1][c]!=2)//directia 1
            {
                if(a[i1][c]==0)a[i1][c]=3;
                i1--;
            }
            i1=l+1;
            while(a[i1][c]!=2)//directia 5
            {
                if(a[i1][c]==0)a[i1][c]=3;
                i1++;
            }
        //pe diagonala 8-4
        i1=l-1; j=c-1;
            while (a[i1][j]!=2)//directia 8
            { if(a[i1][j]!=1) a[i1][j]=3;//marchez cu 3 patratele accesibile
              i1--; j--;}
            i1=l+1; j=c+1;
            while (a[i1][j]!=2)//directia 4
            { if(a[i1][j]!=1) a[i1][j]=3;
              i1++; j++;}
        //pe diagonala 2-6
        i1=l-1; j=c+1;
            while (a[i1][j]!=2)//spre 2
            { if(a[i1][j]!=1) a[i1][j]=3;
              i1--; j++;}
            i1=l+1; j=c-1;
            while (a[i1][j]!=2)//spre 6
            { if(a[i1][j]!=1) a[i1][j]=3;
              i1++; j--;}
    }
    //numarul patratelor accesibile = nr valori de 3 din matrice
    int P=0;
    for(i=1;i<=n;i++)
    for(j=1;j<=i;j++)
       if(a[i][j]==3)P++;
    g<<M<<endl<<P<<endl;
    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 #1039 Betasah

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