Cerința
Fie n
cuburi de aceeaşi mărime, cu feţe colorate. Culorile sunt codificate prin câte o literă de la A
la M
. Pentru fiecare cub se cunosc culorile feţelor în ordinea: bază, capac, faţă frontală, faţă laterală dreapta, faţa din spate, faţă laterală stânga. Să se determine numărul maxim de cuburi care, răsturnate şi rotite convenabil, pot fi puse unul peste altul astfel încât să formeze un turn cu toate feţele uniform colorate (fiecare faţă a turnului sa fie de aceeaşi culoare, de la primul, până la ultimul cub al turnului).
Date de intrare
Fișierul de intrare cuburi1.in
conține pe prima linie numărul de cuburi n
, iar pe a următoarele n
linii culorile fețelor celor n
cuburi.
Date de ieșire
Fișierul de ieșire cuburi1.out
va conține pe prima linie un singur număr ce reprezintă numărul maxim de cuburi care, răsturnate şi rotite convenabil, pot fi puse unul peste altul astfel încât să formeze un turn cu feţele uniform colorate.
Restricții și precizări
0 ≤ n ≤ 50000
- cuburile ce formează un turn sunt aşezate numai unul peste celalalt, nu şi unul lângă celălalt;
- culorile fetelor unui cub se pot repeta pentru două sau mai multe dintre cele 6 feţe ale sale;
- orice cub poate fi rotit sau răsturnat pentru a fi adus într-o poziţie convenabilă;
- culorile fetelor cuburilor care nu formează feţele laterale ale turnului nu au nici o importanţă;
- culorile fețelor sunt litere mari din mulțimea
{A,B,...,M}
Exemplu
cuburi1.in
3 ACADEB FBCDAE AEDCBB
cuburi1.out
2
Explicație
Primul cub poate fi păstrat în poziţia sa, având feţele laterale A
, D
, E
, B
(frontal, lateral-dreapta, spate, lateral-stânga), iar al treilea cub poate fi răsturnat astfel încât să aibă capacele B
şi C
, şi rotit astfel încât să aibă feţele laterale să fie tot A
, D
, E
, B
.
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 Cuburi1:
program cuburi_colorate;
const fi='cuburi1.in';
fo='cuburi1.out';
max=13;lmax=chr(64+max);
type culoare='A'..lmax;
fete_opuse=string[2];
model=string[4];
cub=array[1..3]of fete_opuse;
var s:array [culoare,culoare,culoare,culoare] of word;
f:text;
n,nsol,i,j:word;
c:cub;sol:model;
l1,l2,l3,l4:char;
procedure sort(var f:fete_opuse);
var x:culoare;
begin
if f[1]>f[2] then begin x:=f[1];f[1]:=f[2];f[2]:=x end;
end;
procedure sortm(var c:cub);
var x:fete_opuse;
begin
if c[1]>c[2] then begin x:=c[1];c[1]:=c[2];c[2]:=x end;
if c[1]>c[3] then begin x:=c[1];c[1]:=c[3];c[3]:=x end;
if c[2]>c[3] then begin x:=c[2];c[2]:=c[3];c[3]:=x end;
end;
procedure modele(c:cub);
var m1,m2,m3:model;
begin
m1:=c[1]+c[2];m2:=c[1]+c[3];m3:=c[2]+c[3];
inc(s[m1[1],m1[2],m1[3],m1[4]]);
if m2<>m1 then inc(s[m2[1],m2[2],m2[3],m2[4]]);
if (m3<>m1)and(m3<>m2) then inc(s[m3[1],m3[2],m3[3],m3[4]]);
end;
begin
assign(f,fi);reset(f);
readln(f,n);
c[1]:='xx';c[2]:='xx';c[3]:='xx';
for i:=1 to n do begin
readln(f,c[1][1],c[1][2],c[2][1],c[3][1],c[2][2],c[3][2]);
for j:=1 to 3 do sort(c[j]);
sortm(c);
modele(c);
end;
close(f);
assign(f,fo);rewrite(f);
nsol:=0;sol[0]:=chr(4);
for l1:='A' to lmax do
for l2:='A' to lmax do
for l3:='A' to lmax do
for l4:='A' to lmax do
if s[l1,l2,l3,l4]>nsol then
nsol:=s[l1,l2,l3,l4];
writeln(f,nsol);
close(f)
end.
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 #739 Cuburi1
Pe această pagină găsești rezolvarea de 100 de puncte pentru problema #739 Cuburi1 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!