Sunteți pe pagina 1din 2

Principiile pe baza carora functioneaza programul acesta de desfacere a cubului cu 6

laturi si 6 culori

Programul incepe cu o procedura denumita bgn1 care pe langa faptul ca citeste


prima din laturile cubului mai explica destul de simplu cum trebuie date informatiile de
intrare programului.
Aceasta procedura incearca sa indrume utilizatorul prin cateva culori asociate unor
numere dar si unei mici scheme.In structura gasim o variabila foarte importanta , o
matrice de dimensiuni 6 cu 9 care reprezinta matricea cu culorile lor in forma lor
originala, deoarece avem nevoie de valorile originale tot timpul in program, aceasta
matrice va ramane neschimbata dupa ce e completata si vom folosii alta matrice cu care
ne vom “juca”.
Dupa prima procedura incepe o a doua procedura care are rolul de inregistra cu o
functie repetitiva: for ibgn2:=2 to 6 sa inregistreze valorile de pe celelalte fete.Procedura
aceasta foloseste la randul ei o alta procedura dysPart(dysplay partial) care are rolul doar
de a “desena” pe ecran, urmat apoi de o intrebare daca datele intrate sunt corecte.
Procedura dyspart foloseste si ea la randul ei doua(bco: begin colors si eco: end
colors) alte proceduri care au menirea de a afisa o cifra cu culoarea ei “ajutatoare”.

Dupa ce toate datele de intrare au fost introduse programul va folosii matricea


numarul 2 pozV(pozitia vortuala/imaginara) care reprezinta cum ar arata cubul pe parcurs
ce calculatorul il va schimba pentru a ajunge la solutia finala.Procedura pozv0 va face
toate elementele din matrice sa inceapa de la capat cu valorile initiale.
Deuarece vom avea nevoie mai tarziu de booleanul Ok pentru a incheia programul
dupa ce gaseste solutia, il vom declara de acuma.

Avem acuma un For, deoarece vom incerca sa rezolvam mai intai acele solutii
care ale cubului care se desfac din 2-3-4 (deoarece sunt mult mai rapide)mutari decat cele
de 8-9-10 acest for va lua in ordine solutiile din 2-3-4 … 9-10 mutari.Integerul
nrMut(numar de mutari) este si el foarte important si va fii apelat de alte proceduri in
continuare.Dupa acest for aveam un write care ne va spune la cate numar de mutari se
afla calculatorul, fiind foarte importanta asta, deoarece cu fiecare +1 la numarul de mutari
care il luam in calcul calculatorul va lucra de 12 ori mai mult ajungand la un anumit
moment dat sa lucreze peste 1 ora sau chiar mai mult, si asa sa stim daca el lucreaza sau
ce face (de sta “atata timp”).
Urmatoare procedura este SirEg0.In aceasta procedura vectorul portSir(portiune
de sir) este sirul care spune ce mutari a luat in considerare calculatorul la momentul
curent, este un vector de dimensiunea nrMut deoarece nu putem sa mutam mai multe
mutari in momentul acela decat cate neam propus sa mutam.Procedura va face ca acest
vector sa aiba valorile initiale (0,0,0,0…) dupa care calcultaorul va incerca toate
variantele posibile alea acestui sir, elementele din sir sunt intre 0 si 11, de aceea nu putem
lua un integer ci trebuie sa folosim un sir in care putem pune si elemenul 10 si 11.
Punem acum un repeat care se va oprii dupa ce calculatorul va lua in sonsiderare
toate solutiile cu nrMut de mutari, dupa care va incerca cu nrMut+1, nrMut+2, s.s.a.;
acest repeat se va mai oprii si in cazul in care calculatorul a gasit o solutie, nemaifiind
nevoie sa le pargurga restul.
SirPlus1 este o procedura care “unu cate unu” va adauga un “+1” la fiecare
element al vectorului portSir obtinand toate variantele posibile ale acestui sir.
PozVirt0 deoarece avem nevoie de fiecare data cand incerca sa rezolve o solutie
sa o faca de la pozitia initiala a cubului.
Acum printr-un “for” si procedura mutVirt(care face o mutare in matricea pozv)
va incerca sa-si imagineze cum va arata cubul dupa ce va face aceste mutari.
Daca sunt corecte functia pozId(pozitia ideala) se va activa si va modifica
booleanul Ok pentru a oprii programul, dar si va initia procedura cure(a vindeca) care va
spune utilizatorului intr-un mod destul de simplu care sunt mutarile pe care trbuie sa le
faca.
Procedura cure la randul ei initiaza wrSir(write sir) care arata direct solutia pe
primul rand, in cazul care nu vrem sa folosim “intefata prietenoasa” care ne spune mai pe
intelesu nostru, mai simplu, cum trebuie sa mutam.Dys(dysplay) care face acelasi lucru
ca functia dysPart doar ca mult mai eficient fara atatea for-uri,si in speranta ca poate am
vrea sa vedem pe ecran toate variantele pe care le imagineaza calculatorul, in timp ce el
lucraza sa gaseasca solutia(optiune la care am renuntat la un anumit momentdat).Mai
avem aici si procedura dysMove(dysplay move) care spre deosebire de dys si dysPart,
aceasta afiseaza ce mutare am trebuii sa facem noi cu mana, nu cum arata cubul.
Until-ul se va oprii si cand functia maxSir(maximum sir) care verifica daca sirul
portSir exte “maxim”, “maxim” in care daca mai apelam odata functia de crestere +1 ea
va da o eroare.
Dupa ce functia a iesit din until trebuie sa iasa si din “for”, pt a iesii din
“for”(dupa ce ok-ul a fost activat) nu trebuie decat sa dam valorii din for valoarea
maxima pe care i-o da for-ul sau chiar si mai mare.

Programul foloseste destul de multe variabile diferite, care s-ar putea restrange la
un numar mai mic ajungand sa avem doar cate integer-uri pt cateva “for”-uri, dar avand
in vedere ca multe proceduri apeleaza la alte proceduri devine riscant sa pierdem valoriile
memorate in o procedura si apoi modificate de procedura care va fii apelata chiar de
prima.