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 N
3
becuri luminoase numerotate de la 1
la N
3
, 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 f
i
, 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 ≤ N
3
- 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 .
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!