Rezolvare completă PbInfo #1088 Zar

Zarul folosit la diverse jocuri este un cub care are desenat pe fiecare faţă a sa 1, 2, 3, 4, 5 sau 6 puncte. Pe un zar nu există două feţe cu acelaşi număr de puncte şi suma punctelor de pe oricare două feţe opuse este egală cu 7.

Pe o masă de joc este desenat un traseu în formă de pătrat, cu latura de dimensiune n. Fiecare latură a traseului este împărţită în n pătrăţele identice, care au latura egală cu cea a zarului. Zarul este aşezat iniţial în colţul din stânga sus al traseului şi apoi rostogolit de pe o faţă pe alta, din pătrăţel în pătrăţel, de-a lungul traseului parcurs în sensul acelor de ceasornic.

În orice moment ne-am uita la zar, putem vedea numărul punctelor desenate pe trei din feţele sale (aşa cum se vede în desenul de mai sus).

Notăm cu f1 faţa cubului orientată spre noi, f2 faţa superioară a cubului, respectiv cu f3 faţa laterală din dreapta. Pentru exemplul din figură: n=4, faţa dinspre noi (f1) conţine trei puncte, faţa superioară (f2) conţine două puncte, faţa laterală din dreapta (f3) conţine un punct, iar sensul de deplasare este cel precizat prin săgeţi.

Cerinţă

Cunoscând dimensiunea n a traseului şi numărul punctelor de pe cele trei feţe ale zarului în poziţia iniţială, determinaţi după k rostogoliri numărul punctelor ce se pot observa pe fiecare din cele trei feţe ale zarului.

Date de intrare

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

  • pe prima linie numerele naturale n şi k despărţite print-un spaţiu.
  • pe linia a doua trei numere naturale separate printr-un spaţiu ce corespund numărului de puncte de pe feţele f1, f2, respectiv f3 ale zarului în poziţia iniţială.

Date de ieșire

Fișierul de ieșire zar.out va conține o singură linie cu trei numere naturale separate prin câte un spaţiu, care reprezintă numărul punctelor ce se pot observa pe feţele f1, f2 şi f3 (în această ordine) după ce au fost efectuate k rostogoliri pe traseul dat.

Restricții și precizări

  • 2≤n≤20000, 1≤k≤1000000

Exemplu

zar.in

4 11
3 2 1

zar.out

1 5 3

Explicație

Fiecare latură a traseului este formată din 4 căsuţe şi se vor efectua 11 rostogoliri.

După prima rostogolire spre dreapta, valorile celor trei feţe (f1, f2, respectiv f3) ale zarului vor fi 3, 6 şi 2. După a doua rostogolire obţinem numerele 3, 5, 6, iar după a treia rostogolire valorile feţelor vor fi 3, 1 şi 5.

În acest moment zarul a parcurs o latură a traseului. Următoarele trei rostogoliri se vor efectua în jos, de-a lungul traseului iar feţele vor avea succesiv valorile 1, 4, 5 apoi 4, 6, 5 şi 6, 3, 5.

Urmează rostogolirile spre stânga, pe feţele zarului vom observa valorile 6, 5, 4 apoi 6, 4, 2 şi respectiv 6, 2, 3. Ultimele două rostogoliri se vor efectua în sus de-a lungul laturii din stânga a traseului. După penultima rostogolire obţinem 5, 6, 3, iar după ultima rostogolire valorile feţelor vor fi 1, 5 şi 3.

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

#include <fstream>
using namespace std;
ifstream f("zar.in");
ofstream g("zar.out");
int st_dr[4],sus_jos[4],f1,f2,f3;
long n,k;
void afis(int st_dr[])
{   int i;
    g<<endl;
    for(i=1;i<=4;i++)
      g<<st_dr[i]<<"  ";
}
void rostogolire_dreapta(int st_dr[],long p)
{   int i,j,aux;
    p=p%4;
    for(i=1;i<=p;i++)
    {
        aux=st_dr[1];
        for(j=1;j<=3;j++)
            st_dr[j]=st_dr[j+1];
        st_dr[4]=aux;
    }
}


void rostogolire_stanga(int st_dr[],long p)
{   int i,j,aux;
    p=p%4;
    for(i=1;i<=p;i++)
    {
        aux=st_dr[4];
        for(j=4;j>=1;j--)
            st_dr[j]=st_dr[j-1];
        st_dr[1]=aux;
    }
}

int main()
{
f>>n>>k;
f>>f1>>f2>>f3;

st_dr[1]=7-f2; st_dr[2]=f3; st_dr[3]=f2; st_dr[4]=7-f3;
sus_jos[1]=7-f2;sus_jos[2]=f1;sus_jos[3]=f2;sus_jos[4]=7-f1;

while(k>0)
{
    if (k<n)//dreapta
        {rostogolire_dreapta(st_dr,k);k=0;}
        else
        {rostogolire_dreapta(st_dr,n-1);k=k-(n-1);}

    sus_jos[1]=st_dr[1];sus_jos[3]=st_dr[3];

    if (k<n)//jos
        {rostogolire_dreapta(sus_jos,k);k=0;}
        else
        {rostogolire_dreapta(sus_jos,n-1);k=k-(n-1);}

     st_dr[1]=sus_jos[1];st_dr[3]=sus_jos[3];

    if (k<n)//stanga
        {rostogolire_stanga(st_dr,k);k=0;}
        else
        {rostogolire_stanga(st_dr,n-1);k=k-(n-1);}

    sus_jos[1]=st_dr[1];sus_jos[3]=st_dr[3];

    if (k<n)//sus
        {rostogolire_stanga(sus_jos,k);k=0;}
        else
        {rostogolire_stanga(sus_jos,n-1);k=k-(n-1);}
     st_dr[1]=sus_jos[1];st_dr[3]=sus_jos[3];



}
g<<sus_jos[2]<<" "<<st_dr[3]<<" "<<st_dr[2];

    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 #1088 Zar

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