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.
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
#include <bits/stdc++.h> #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; }