Documente Academic
Documente Profesional
Documente Cultură
Alexandru VARACUTA
Chișinău, 2014
Referat la
INFORMATICĂ
Jocul Perspico
Grup altern
În teoria grupurilor finite, un grup altern este un subgrup de indice doi
al grupului simetric, format din permutările pare ale unei mulțimi finite.
Cuprins
1 Exemplu
2 Câteva proprietăți
3 Bibliografie
4 Legături externe
Exemplu
Este cunoscut faptul că în jocul de Perspico ( Taquin sau 15-puzzle ) nu
pot fi realizate toate configurațiile aparent posibile. Doar jumătate din
configurații sunt accesibile prin mutări ”legale” (adică fără a demonta jocul) în
timp ce celelte configurații sunt ”imposibile”.
Câteva proprietăți
(a) (b)
Fig. V-12. Configurație inițială (a), Configurație finală CF (b)
Page 4 din 10
O configuratie data poate fi transformata in configuratia finala CF daca si
numai daca
Se elimina singurul nod din lista si se adauga cei patru fii ai sai (pana
cand se ajunge la configuratia ceruta). Adaugarea s-a facut la sfarsitul listei.
Se alege nodul cu cel mai mic cost -cel cu costul 4-; daca sunt mai
multe noduri cu cost minim se considera unul oarecare dintre ele, daca acesta
nu duce la solutia finala, atunci se va reveni si la celelalte. Se elimina din
lista nodul de cost 4 si se adauga fiii sai.
Page 6 din 10
Se identifica nodul de cost minim, se sterge din lista si se adauga fiii
sai. Se observa ca fiul obtinut prin deplasarea casutei libere in jos este chiar
configuratia ceruta, astfel ca algoritmul se încheie.
Page 7 din 10
Un algoritm general de rezolvare este dat de:
I.1.3 Aplicații
Jocul Perspico
Jocul Perspico
Page 8 din 10
void CautaX (int A[][4], int& l, int& c) active[n].sol=new
} char[strlen(active[tata].sol)+2];
int solv(int A[][4]) strcpy(active[n].sol,active[tata
int cost(int A[][4]) ].sol);
int Mutare(int tata, char directie) dir[0]=directie;
//adauga un nod activ nou, strcat(active[n].sol,dir);
descendent din tata if((cont=cost(active[n].A))==0/
//obtinut prin mutarea casutei libere *sfarsit*/)
in directia specificata active[n].cost=strlen(active[n].
//intoarce 1 daca a fost obtinuta sol)+cont;
configuratia finala, 0 altfel n++;
} return 0;
}
int l,c, cont;char dir[]=' '; void Perspico()while(1);
}
CautaX(active[tata].A,l,c);// void main()
caut X de coordonate (l, c) ,,,};
//daca nu se poate efectua
deplasarea casutei libere in directia //inseram configuratia initiala
dorita renuntam in lista
if((directie=='u'&&l==0)|| for(int i=0;i<16;i++)
(directie=='r'&&c==3)|| active[0].A[i/4][i
(directie=='d'&&l==3)|| %4]=A[i/4][i%4];
(directie=='l'&&c==0)) active[0].sol=new char;
return 0; active[0].sol[0]='0';
// copiem starea curenta a active[0].cost=cost(A);
casutelor (matricea) n=1;
for(int i=0;i<16;i++) if(active[0].cost==0)
active[n].A[i/4][i cout<<'Aceasta este
%4]=active[tata].A[i/4][i%4]; solutia finala!';
// deplasam casuta libera (l,c) else
cu (l+1,c) if(solv(A))
int temp=active[n].A[l][c]; else
switch(directie) cout<<'problema
nu are solutie';
// adaugam noua configuratie }
in lista
BILIOGRAFIE: