Reptes
Repte 12 — El laberint ★★★ Avançat
En Karel és l'extrem superior esquerre, que és l'entrada d'un laberint. En Karel ha d'arribar a la perla que es troba a l'extrem oposat, però ha de superar un laberint.
Sempre existeix un camí que porta en Karel fins a la perla. Escriu un programa que funcioni per a qualsevol laberint, sigui quina sigui la seva forma o mida. El teu codi no pot assumir res sobre la geometria concreta del laberint.
Restricció important: no pots codificar el camí pas a pas. Has de descobrir un algorisme genèric que segueixi les parets fins trobar la sortida. Fixa't que els mons que et presentem són ben diferents.
Sempre existeix un camí que porta en Karel fins a la perla. Escriu un programa que funcioni per a qualsevol laberint, sigui quina sigui la seva forma o mida. El teu codi no pot assumir res sobre la geometria concreta del laberint.
Restricció important: no pots codificar el camí pas a pas. Has de descobrir un algorisme genèric que segueixi les parets fins trobar la sortida. Fixa't que els mons que et presentem són ben diferents.
💡 Pista — la regla de la mà dreta
Imagina que poses la mà dreta a la paret del laberint i camines sempre
mantenint el contacte amb ella. Quan la paret acaba (la dreta és lliure),
gires a la dreta i avances. Si la paret continua però el davant és lliure,
avances recte. Si tens paret tant a la dreta com al davant, gires a
l'esquerra (però no avances: potser ara el davant és lliure i
caldrà tornar a comprovar). Aquesta regla garanteix que trobaràs la
sortida en qualsevol laberint.
💡 Pista — un sol pas, repetit moltes vegades
La clau és definir una funció
Hauràs de tenir en compte tres casos: dreta lliure, dreta ocupada però davant lliure, i dreta i davant ocupats. Cada cas fa una acció diferent.
Pots usar
un_sol_pas(), que implementi
exactament un pas amb la regla de la mà dreta.Hauràs de tenir en compte tres casos: dreta lliure, dreta ocupada però davant lliure, i dreta i davant ocupats. Cada cas fa una acció diferent.
Pots usar
right_is_clear(),
front_is_clear() i turn_right() juntament
amb les funcions que ja coneixes.