Rezolvare completă PbInfo #1185 Cub2

Sărbătorile de iarnă tocmai s-au încheiat. Florinel dorește să-și ajute părinții la despodobirea bradului. Tubul luminos pe care l-au folosit anul acesta este mai special. Are N3 becuri luminoase numerotate de la 1 la N3, iar fiecare bec care este inscripționat cu un număr prim, va rămâne mereu aprins. Cutia în care trebuie strâns tubul este un cub de latură N. Becul cu numărul 1, trebuie pus în colțul de coordonate (1,1,1), restul în spirală până la umplerea nivelului, apoi nivelul următor în sens invers, ș.a.m.d.

Exemplu – N = 3

Nivel 1

1 2 3
8 9 4
7 6 5

Nivel 2

18 17 16
11 10 15
12 13 14

Nivel 3

19 20 21
26 27 22
25 24 23

Fața 1 (spate)

21, 20, 19,
16, 17, 18,
 3,  2,  1

Fața 2 (dreapta)

23, 22, 21
14, 15, 16,
 5,  4,  3,

Fața 3 (frontal)

25, 24, 23,
12, 13, 14,
 7,  6,  5,

Fața 4 (stânga)

19, 26, 25,
18, 11, 12,
 1,  8,  7,

Cerința

Cunoscând latura N a cubului, să se umple cubul cu tubul luminos (becurile fiind legate crescător), apoi să se determine:

1. Coordonatele (x,y,z) ale becului cu numărul V. (x-linia, y-coloana, z-înălțimea)
2. Numărul de becuri luminoase situate pe fiecare față a cubului.

Date de intrare

Fişierul de intrare cub2.in conţine pe prima linie un număr natural p. Pentru toate testele de intrare, numărul p poate avea doar valoarea 1 sau valoarea 2.

Pe a doua linie a fișierului de intrare, sunt scrise două numere naturale N și V separate printr-un spațiu reprezentând dimensiunea cubului și valoarea becului pentru care trebuie determinate coordonatele.

Date de ieșire

Dacă valoarea lui p este 1, se va rezolva numai cerinţa 1. În acest caz, în fişierul de ieşire cub2.out se vor scrie trei numere naturale x y z, separate prin câte un spațiu, reprezentând coordonatele becului cu valoarea V.

Dacă valoarea lui p este 2, se va rezolva numai cerinţa 2. În acest caz, fişierul de ieşire cub2.out va conține 4 linii. Pe fiecare linie i, se va scrie câte un număr natural fi, reprezentând numărul de becuri inscripționate cu numere prime de pe fața i.

Restricții și precizări

  • 1 ≤ N ≤ 200
  • 1 ≤ V ≤ N3
  • Pentru rezolvarea corectă a primei cerinţe se acordă 20 de puncte, iar pentru cerința a doua se acordă 80 de puncte.
  • Pentru 20% dintre teste: 1 ≤ N ≤ 20
  • Pentru 30% dintre teste: 21 ≤ N ≤ 100
  • Pentru 50% dintre teste: 101 ≤ N ≤ 200

Exemple

cub2.in

1
3 10

cub2.out

2 2 2

Explicație

Atenție! Pentru acest test se rezolvă doar cerința 1).
linia 2, coloana 2, nivel 2 – este becul 10

cub2.in

2
3 10

cub2.out

4
3
4
3

Explicație

Atenție! Pentru acest test se rezolvă doar cerința 2).

4 – becuri inscripționate cu numere prime pe fața 1: 2, 3, 17, 19
3 – becuri inscripționate cu numere prime pe fața 2: 3, 5, 23
4 – becuri inscripționate cu numere prime pe fața 3: 5, 7, 13, 23
3 – becuri inscripționate cu numere prime pe fața 4: 7, 11, 19

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

///prof. Gorea Claudiu-Cristian
///C.N. Al. Papiu Ilarian Tg-Mures
#include <fstream>
using namespace std;
ifstream fin ("cub2.in");
ofstream fout("cub2.out");
int a[201][201],b[201][201];
int p,n,v,i,j,x,k,sum,f1,f2,f3,f4,nr;
int prim(int m)
{
    int d;
    if (m<2 ||(m>2 && m%2==0)) return 0;
    for(d=2;d*d<=m;d++)
        if(m%d==0) return 0;
    return 1;
}
void afisare(int mat[201][201])
{
    int l,c;
    for(l=1;l<=n;l++)
    {
        for(c=1;c<=n;c++)
            fout<<mat[l][c]<<" ";
        fout<<endl;
    }
    fout<<"---------------------\n";
}
int main()
{
    fin>>p;
    fin>>n>>v;
///nivel 1 - matrice A
    x=1;
    k=0;
    while(x<=n/2)
    {
        ///spre stanga - linia x
        for(j=x;j<=n-x;j++)
            a[x][j]=++k;
        ///spre jos - coloana n-x+1
        for(i=x;i<=n-x;i++)
            a[i][n-x+1]=++k;
        ///spre stanga - linia n-x+1
        for(j=n-x+1;j>x;j--)
            a[n-x+1][j]=++k;
        ///spre sus - coloana x
        for(i=n-x+1;i>x;i--)
            a[i][x]=++k;
        x++;
    }
    if (n%2==1) a[n/2+1][n/2+1]=++k;
    //afisare(a);
///nivel 2 - matrice B
    sum=2*n*n+1;
    for(i=1;i<=n;i++)
        for(j=1;j<=n;j++)
            b[i][j]=sum-a[i][j];
    //afisare(b);
    if (p==1)
    {
        ///cerinta 1
        x=v;
        int nivel=0;
        while(x>2*n*n)
            x=x-2*n*n, nivel+=2;
        int stop=0;
        for(i=1;i<=n && stop==0; i++)
            for(j=1;j<=n && stop==0; j++)
            {
                if(a[i][j]==x)
                {
                    fout<<i<<" "<<j<<" "<<nivel+1<<endl;
                    stop=1;
                }
                if(b[i][j]==x)
                {
                    fout<<i<<" "<<j<<" "<<nivel+2<<endl;
                    stop=1;
                }
            }
    }
    else
    {
        ///cerinta 2
        f1=f2=f3=f4=0;
        ///fata 1 - linia 1 A,B,.... 200*200 elemente=40.000 nr de testat
        for(j=1;j<=n;j++)
        {
            nr=a[1][j];
            while(nr<n*n*n)
            {
                if (prim(nr)) f1++;
                nr+=2*n*n;
            }
            nr=b[1][j];
            while(nr<n*n*n)
            {
                if (prim(nr)) f1++;
                nr+=2*n*n;
            }
        }
        ///fata 2 - coloana n A,B,....
        for(i=1;i<=n;i++)
        {
            nr=a[i][n];
            while(nr<n*n*n)
            {
                if (prim(nr)) f2++;
                nr+=2*n*n;
            }
            nr=b[i][n];
            while(nr<n*n*n)
            {
                if (prim(nr)) f2++;
                nr+=2*n*n;
            }
        }
        ///fata 3 - linia n A,B,....
        for(j=1;j<=n;j++)
        {
            nr=a[n][j];
            while(nr<n*n*n)
            {
                if (prim(nr)) f3++;
                nr+=2*n*n;
            }
            nr=b[n][j];
            while(nr<n*n*n)
            {
                if (prim(nr)) f3++;
                nr+=2*n*n;
            }
        }
        ///fata 4 - coloana 1 A,B,....
        for(i=1;i<=n;i++)
        {
            nr=a[i][1];
            while(nr<n*n*n)
            {
                if (prim(nr)) f4++;
                nr+=2*n*n;
            }
            nr=b[i][1];
            while(nr<n*n*n)
            {
                if (prim(nr)) f4++;
                nr+=2*n*n;
            }
        }
        fout<<f1<<'\n';
        fout<<f2<<'\n';
        fout<<f3<<'\n';
        fout<<f4<<'\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 #1185 Cub2

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