![]() |
Mòdul
4
![]() |
Fonaments de
Programació. Llenguatge C/C++![]() |
Pràctica ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
![]() |
![]() |
|
Pràctica
d'ampliació ![]() |
![]() |
Les vuit reines
Aquest és un dels problemes més utilitzats per mostrar una tècnica de programació que s'anomena algorismes de tornada enrera o, en anglès, backtracking.
|
![]() |
Desenvolupament de la pràctica
El problema de les vuit reines consisteix en col·locar en un tauler d'escacs (que té 8x8=64 caselles) vuit reines de forma que cap d'elles amenaci a cap altra. Un mètode exhaustiu de trobar totes les posicions possibles de col·locar 8 reines en un tauler d'escacs i provar una a una si es compleix la condició és un mètode molt poc eficient ja que hi ha 4.426.165.368 de possibilitats. El mètode exhaustiu es podria millorar si assignem a cada una de les reines una columna del tauler i només ens preocupem de triar una fila per cadascuna de les reines. El número de possibilitats ha baixat a 88=16.777.216. Si una vegada col·locada la reina de la columna 1 en la fila 4, per exemple, prohibim que la fila 4 torni a sortir, només tenim 7 possibilitats per a la segona reina. Si prohibim que la tercera reina estigui a la mateixa fila que la primera o que la segona, tenim 6 possibilitats per a la tercera reina, és a dir, només haurem de provar 8!=8·7·6·5·4·3·2·1=40.320. El mètode de tornada enrera consisteix en explorar solucions parcials i acceptar-les o refusar-les. Una solució parcial és refusada si ella mateixa no compleix les condicions que s'imposen a una solució o bé cap de les solucions que es poden formar a partir d'ella les compleix. En el cas del problema de les vuit reines s'actuaria de la següent forma:
La primera solució trobada en el cas de les vuit reines és: 1 5 8 6 3 7 2 4 que correspon a la següent posició: El codi per resoldre aquest problema és el següent:
Explicació del programa El programa va col·locant les reines en el vector sol[]. Si sol[0]=2 vol dir que es col·loca la reina 0 en la fila 2. Cada reina té assignat el mateix número que la columna on està situada. La funció comprova té com arguments el vector sol[] i un nombre enter n i aquesta funció retorna 0 en el cas que la reina n amenaci a alguna reina ja col·locada: Hi ha dues possibilitats perquè la funció torni un 0 (amenaça):
La funció principal que fa tot el càlcul és la funció explorar(). Aquesta funció és una funció recursiva ja que es crida a sí mateixa. La funció explorar(sol, n, ct) es crida si les n reines anteriors a n (0,...(n-1)) ja estan ben col·locades i el que fa és explorar si la posició ct és admissible per a la reina n. Si aquesta posició és bona i no s'ha col·locat ja l'última reina, explora la següent reina des de la posició 0.
|