Reptes
Repte 12 — El laberint ★★★ Avançat
En Karel és a 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 perla i recollir-la. 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 perla i recollir-la. 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
perla en qualsevol laberint com aquests, en què totes les roques estan unides
a la vora del món (sense illes de roca al mig).
💡 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.