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:
- citeşte un roboprogram şi determină numărul de cifre afişate pe ecran după executarea roboprogramului;
- citeşte un roboprogram şi determină cifrele afişate pe ecran după executarea roboprogramului;
- 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ărulN
; 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ţiuniD
.
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 .
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!