Rezolvare completă PbInfo #739 Cuburi1

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 Adresa de email.

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!