Il DFS parte da una cella (r, c) Ottiene i vicini non visitati: (nr, nc) Per ciascuno:
Immaginiamo che ogni cella “logica” sia separata da un muro orizzontale o verticale. Per esempio, una griglia rows x cols ha effettivamente dimensione 2rows+1 x 2cols+1, dove:
Step ricorsivo carve(r, c):
Vengono considerati solo i vicini non ancora visitati. Si scava una volta sola verso ogni vicino non visitato. Dopo che un vicino è stato visitato, non verrà più scavato da un’altra cella. Pertanto non verranno tolti tutti i muri ma solo alcuni.
Supponiamo: Stai nella cella logica (1, 1) → posizione reale (3, 3) Vuoi scavare verso Sud → vicino logico (2, 1) allora: dr = +1, dc = 0 il muro tra (1, 1) e (2, 1) è a (3 + 1, 3 + 0) = (4, 3) Quel Wall in (4, 3) viene trasformato in Floor.
L’algoritmo parte da una cella e visita ogni cella esattamente una volta. Si forma un albero aciclico in cui tutte le celle sono connesse tra loro.
Ogni volta che raggiunge una nuova cella, la connette al resto del labirinto rimuovendo un solo muro Continua finché tutte le celle sono visitate (quindi sono tutte connesse al labirinto)
Dal momento che il DFS scava solo verso celle non visitate, non si formano mai cicli. Quindi: