En aquest exercici, heu d’implementar un programa que llegeix comandes que manipulen variables que guarden àrbres binaris d’enters. La primera comanda numvars= n ; indica el nombre total n de variables. Els noms d’aquestes variables son t0,…,tn, i se suposa que inicialment cadascuna guarda un àrbre buit. Després venen comandes que construeixen nous àrbres a partir de variables i els assignen a variables (com per exemple t2 =BinTree( 3 , t0 , t1 );, i comandes que accedeixen als fills d’un arbre existent i els assignen a variables (com per exemple t3 = t2 .left(); o t3 = t2 .right();). També hi ha comandes per a escriure per la sortida un àrbre en
INLINEFORMAT (com per exemple cout<<
t2 ;),
i instruccions per a escriure la mida o la suma dels valors d’un arbre guardat en una variable, com per exemple
(cout<<
size( t2 )<<endl;
o cout<<
sum( t2 );).
Aquest és un exemple d’entrada del programa:
numvars= 4 ; t1 =BinTree( 1 , t2 , t3 ); t2 =BinTree( 2 , t1 , t3 ); t3 =BinTree( 3 , t2 , t1 ); cout<< t0 <<endl; cout<< t1 <<endl; cout<< t2 <<endl; cout<< t3 <<endl; cout<<size( t0 )<<endl; cout<<size( t1 )<<endl; cout<<size( t2 )<<endl; cout<<size( t3 )<<endl; cout<<sum( t0 )<<endl; cout<<sum( t1 )<<endl; cout<<sum( t2 )<<endl; cout<<sum( t3 )<<endl; t1 =BinTree( 1 , t2 , t3 ); t2 =BinTree( 2 , t1 , t3 ); t3 =BinTree( 3 , t2 , t1 ); cout<< t0 <<endl; cout<< t1 <<endl; cout<< t2 <<endl; cout<< t3 <<endl; cout<<size( t0 )<<endl; cout<<size( t1 )<<endl; cout<<size( t2 )<<endl; cout<<size( t3 )<<endl; cout<<sum( t0 )<<endl; cout<<sum( t1 )<<endl; cout<<sum( t2 )<<endl; cout<<sum( t3 )<<endl; t1 = t3 .left(); t2 = t1 .right(); t3 = t2 .left(); cout<< t0 <<endl; cout<< t1 <<endl; cout<< t2 <<endl; cout<< t3 <<endl; cout<<size( t0 )<<endl; cout<<size( t1 )<<endl; cout<<size( t2 )<<endl; cout<<size( t3 )<<endl; cout<<sum( t0 )<<endl; cout<<sum( t1 )<<endl; cout<<sum( t2 )<<endl; cout<<sum( t3 )<<endl;
La sortida del programa amb la seqüència de comandes d’entrada anterior hauria de ser:
() 1 2(1,) 3(2(1,),1) 0 1 2 4 0 1 3 7 () 1(2(1,),3(2(1,),1)) 2(1(2(1,),3(2(1,),1)),3(2(1,),1)) 3(2(1(2(1,),3(2(1,),1)),3(2(1,),1)),1(2(1,),3(2(1,),1))) 0 7 12 20 0 11 20 34 () 2(1(2(1,),3(2(1,),1)),3(2(1,),1)) 3(2(1,),1) 2(1,) 0 12 4 2 0 20 7 3
Com podeu observar a l’exemple d’entrada anterior, hi han espais en blanc per a facilitar la lectura. Podeu llegir i tractar les comandes així:
#include <iostream> #include <string> #include <cstdlib> //... using namespace std; #include "BinTree.hh" int getIdVar(string s) { return atoi(s.substr(1).c_str()); } //... int main() { //... string s1, s2, s3, s4, s5, s6, s7; int numvars; cin >> s1 >> numvars >> s2; // ... while (cin >> s1 >> s2) { if (s1[0] == 't') { int idvar = getIdVar(s1); if (s2 == "=BinTree(") { int value; cin >> value >> s3 >> s4 >> s5 >> s6 >> s7; int idvar1 = getIdVar(s4); int idvar2 = getIdVar(s6); //... } else if (s2 == "=") { cin >> s3 >> s4; int idvar1 = getIdVar(s3); if (s4 == ".left();") { //... } else { //... } } } else if (s1 == "cout<<") { int idvar = getIdVar(s2); cin >> s3; //... //....setOutputFormat(BinTree<int>::INLINEFORMAT); //cout << ... << endl; } else if (s1 == "cout<<size(") { int idvar = getIdVar(s2); cin >> s3; //... } else if (s1 == "cout<<sum(") { int idvar = getIdVar(s2); cin >> s3; //... } } }
Fixeu-vos que l’enunciat d’aquest exercici us ofereix el fitxer BinTree.hh. Us falta crear el fitxer main.cc, que haurieu de construïr a partir de la plantilla que us hem oferit abans, fent un ús convenient del tipus BinTree. Només cal que pugeu main.cc al jutge.
Observació: Us recomanem que comenceu implementant una solució bàsica per tal de superar els jocs de proves públics i obtenir així la meitat de la nota. Ja la optimitzareu més endavant si teniu temps.
Entrada
La primera linia de l’entrada és de la forma numvars= LIMIT ;, a on LIMIT és un nombre natural positiu. Després venen instruccions d’aquestes menes:
tNUM =BinTree( VALUE , tNUM1 , tNUM2 ); tNUM1 = tNUM2 .left(); tNUM1 = tNUM2 .right(); cout<< tNUM <<endl; cout<<size( tNUM )<<endl; cout<<sum( tNUM )<<endl;
On VALUE es un enter i NUM, NUM1, NUM2 son naturals en el rang {0,…,LIMIT-1}.
Se suposa que les entrades son correctes: sempre es demana accedir a left o right d’arbres no buits, i no es produeixen errors d’overflow.
Sortida
Per a cada instrucció dels següents tres tipus, el vostre programa ha d’escriure el resultat esperat (l’arbre contingut en la variable en INLINEFORMAT, o la mida de l’arbre contingut en la variable, o la suma de l’arbre contingut en la variable, segons el cas).
cout<< tNUM <<endl; cout<<size( tNUM )<<endl; cout<<sum( tNUM )<<endl;
Observació
La solució d’aquest exercici s’ha de basar en un ús raonable del tipus BinTree. Qualsevol solució que ignori això i faci servir enfocaments o estructures de dades alternatives que no formen part de l’assignatura serà invalidada.
Avaluació sobre 10 punts:
Entenem com a solució ràpida una que és correcta, on cada operació té cost CONSTANT, i capaç de superar els jocs de proves públics i privats. Entenem com a solució lenta una que no és ràpida, però és correcta i capaç de superar els jocs de proves públics.
Input
numvars= 4 ; t1 =BinTree( 1 , t2 , t3 ); t2 =BinTree( 2 , t1 , t3 ); t3 =BinTree( 3 , t2 , t1 ); cout<< t0 <<endl; cout<< t1 <<endl; cout<< t2 <<endl; cout<< t3 <<endl; cout<<size( t0 )<<endl; cout<<size( t1 )<<endl; cout<<size( t2 )<<endl; cout<<size( t3 )<<endl; cout<<sum( t0 )<<endl; cout<<sum( t1 )<<endl; cout<<sum( t2 )<<endl; cout<<sum( t3 )<<endl; t1 =BinTree( 1 , t2 , t3 ); t2 =BinTree( 2 , t1 , t3 ); t3 =BinTree( 3 , t2 , t1 ); cout<< t0 <<endl; cout<< t1 <<endl; cout<< t2 <<endl; cout<< t3 <<endl; cout<<size( t0 )<<endl; cout<<size( t1 )<<endl; cout<<size( t2 )<<endl; cout<<size( t3 )<<endl; cout<<sum( t0 )<<endl; cout<<sum( t1 )<<endl; cout<<sum( t2 )<<endl; cout<<sum( t3 )<<endl; t1 = t3 .left(); t2 = t1 .right(); t3 = t2 .left(); cout<< t0 <<endl; cout<< t1 <<endl; cout<< t2 <<endl; cout<< t3 <<endl; cout<<size( t0 )<<endl; cout<<size( t1 )<<endl; cout<<size( t2 )<<endl; cout<<size( t3 )<<endl; cout<<sum( t0 )<<endl; cout<<sum( t1 )<<endl; cout<<sum( t2 )<<endl; cout<<sum( t3 )<<endl;
Output
() 1 2(1,) 3(2(1,),1) 0 1 2 4 0 1 3 7 () 1(2(1,),3(2(1,),1)) 2(1(2(1,),3(2(1,),1)),3(2(1,),1)) 3(2(1(2(1,),3(2(1,),1)),3(2(1,),1)),1(2(1,),3(2(1,),1))) 0 7 12 20 0 11 20 34 () 2(1(2(1,),3(2(1,),1)),3(2(1,),1)) 3(2(1,),1) 2(1,) 0 12 4 2 0 20 7 3