Rezolvare completă PbInfo #2102 Robot3

Paul dorește să învețe cum să programeze un robot. Pentru început s-a gândit să construiască un robot format dintr-un mâner, 10 butoane aranjate circular şi un ecran. Pe butoane sunt scrise, în ordine crescătoare, cifrele de la 0 la 9, ca în figură.

Un roboprogram va fi format dintr-o secvenţă de instrucţiuni. Instrucțiunile pot fi:

Instructiune Semnificatie
Dp Mânerul robotului se deplasează spre dreapta cu p poziţii (p este o cifră)
Sp Mânerul robotului se deplasează spre stânga cu p poziţii (p este o cifră)
A Este apăsat butonul în dreptul căruia se află mânerul robotului şi pe ecran apare cifra scrisă pe buton
T Terminarea programului (se utilizează o singură dată la final şi este precedată de cel puţin o instrucțiune A)

Iniţial mânerul robotului este plasat în dreptul butonului 0, iar ecranul este gol.
De exemplu, în urma executării roboprogramului D4AS1AAD6AT robotul apasă butoanele pe care sunt scrise cifrele 4, 3, 3, 9, iar pe ecran va apărea 4339.

Cerințe

Să se scrie un program care rezolvă următoarele cerinţe:

  1. citeşte un roboprogram şi determină numărul de cifre afişate pe ecran după executarea roboprogramului;
  2. citeşte un roboprogram şi determină cifrele afişate pe ecran după executarea roboprogramului;
  3. citeşte un număr natural N şi construieşte un roboprogram de lungime minimă prin executarea căruia pe ecran se va obţine numărul N; deoarece robotului îi place să se deplaseze în special spre dreapta, dacă există mai multe roboprograme de lungime minimă, se va afişa roboprogramul cu număr maxim de instrucţiuni D.

Date de intrare

Fişierul de intrare robot3.in conţine pe prima linie un număr natural C, reprezentând cerinţa care urmează să fie rezolvată (1, 2 sau 3). Dacă C=1 sau C=2, pe a doua linie a fişierului se află un roboprogram. Dacă C=3, pe a doua linie a fişierului de intrare se află numărul natural N.

Date de ieșire

Fişierul de ieşire robot3.out va conţine o singură linie. Dacă C=1, pe prima linie se va scrie un număr natural reprezentând numărul de cifre afişate pe ecran după executarea roboprogramului din fişierul de intrare.
Dacă C=2, pe prima linie vor fi scrise cifrele afișate pe ecran în urma executării roboprogramului din fişierul de intrare. Dacă C=3, pe prima linie va fi scris roboprogramul solicitat de cerinţa 3.

Restricții și precizări

0 ≤ N ≤ 1000000000
• Lungimea roboprogramului citit din fişierul de intrare sau scris în fişierul de ieşire este cel mult 1000 de caractere.
• Dacă mânerul este plasat în dreptul butonului 0 şi se deplasează spre dreapta, se va îndrepta către butonul 1; dacă deplasarea este spre stânga, se va îndrepta către butonul 9.
• Pentru rezolvarea corectă a primei cerinţe se acordă 10 puncte, pentru rezolvarea corectă a celei de a doua cerințe se acordă 30 de puncte, iar pentru rezolvarea corectă a celei de a treia cerințe se acordă 50 de puncte. 10 puncte se acordă din oficiu.

Exemplul 1:

robot3.in

1
D1AD2AS1AT

robot3.out

3

Explicație

C=1, pentru acest test se rezolvă cerința 1.
Se afişează pe ecran 3 cifre (132)

Exemplul 2:

robot3.in

2
S0AD2AS1AT

robot3.out

021

Explicație

C=2, pentru acest test se rezolvă cerința 2.
Mânerul robotului se deplasează cu 0 unități la stânga, deci rămâne în dreptul butonului 0 și apasă, apoi se deplasează 2 unități spre dreapta şi ajunge în dreptul butonului 2, apasă, apoi se deplasează 1 unitate la stânga și ajunge în dreptul butonului 1 și apasă acest buton → 021.

Exemplul 3:

robot3.in

3
19332

robot3.out

D1AS2AD4AAS1AT

Explicație

C=3, pentru acest test se rezolvă cerința 3. Pentru a afișa cifra 1, mânerul robotului se deplasează 1 unitate la dreapta după care apasă (D1A). Pentru a afișa cifra 9, din poziția curentă mânerul robotului se deplasează 2 unități la stânga şi apasă (S2A). Pentru a afișa cifra 3, din poziția curentă mânerul robotului se deplasează 4 unități la dreapta după care apasă (D4A). Pentru a afișa a doua cifra 3, mânerul robotului rămâne în poziția curentă și apasă butonul. Pentru a afișa cifra 2, din poziția curentă mânerul robotului se deplasează 1 unitate la stânga după care apasă (S1A). Programul se termină cu instrucțiunea T → D1AS2AD4AAS1AT

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

//Jakab Tunde
#include <iostream>
#include <fstream>
#include <stdlib.h>
using namespace std;

int main()
{ifstream in("robot3.in");
 ofstream out("robot3.out");
 char c;
 int a=0,b=0,n=0,m=0,z=0,e,d,p;
 in>>p;

 if(p==1){
   while(!in.eof()){
     in>>c;
     if (c=='A')a++;
   }
   out<<a<<endl;
 }

 if(p==2){
   in>>c;
   b=0;
   while(c!='T'){
      if (c=='D'){
        in>>c;
        a=c-48;
        b=(b+a)%10;
      }else if (c=='S'){
              in>>c;
              a=c-48;
              b=(b+10-a)%10;
            }
      if(c=='A')out<<b;
      in>>c;
   }
 }

 if(p==3){
 in>>a;
 if(a==0)out<<"A";
 else
   if(a<10){if(10-a<a)out<<'S'<<10-a<<'A';
            else out<<'D'<<a<<'A';
            }
   else
    {
    z=0;
    while(a%10==0){
      z++;
      a=a/10;
    }
    while(a!=0){
      b=b*10+a%10;
      a=a/10;
    }
    a=b;
    b=a%10;
    if(10-b<b)out<<'S'<<10-b<<'A';
    else out<<'D'<<b<<'A';
    a=a/10;
    while(a!=0){
      if(b==a%10)out<<'A';
      else
        if(b>a%10)
          if(10-b+a%10<=b-a%10)out<<'D'<<10-b+a%10<<'A';
          else out<<'S'<<b-a%10<<'A';
        else if(10-a%10+b<a%10-b)out<<'S'<<10-a%10+b<<'A';
             else out<<'D'<<a%10-b<<'A';
      b=a%10;
      a=a/10;
    }
    if(z!=0){
      if(10-b<b)out<<'D'<<b;
      else out<<'S'<<b;
      while(z!=0){
        out<<'A';
        z--;
      }
    }
   }
  out<<'T';
 }
 in.close();
 out.close();
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 #2102 Robot3

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