Sto lavorando su questo al momento ... Partendo da un bordo, sto percorrendo a caso una serie quadrata, segnando celle con la lunghezza del percorso mentre le passo attraverso.
Quando rimani bloccato (e lo farai), crea una giunzione a T formando un anello con il percorso più recente adiacente (ma vedi sotto). Poi torno indietro lungo il percorso esistente dall'altra parte dell'incrocio a T e rompere il loop lì. Questa coda ciondolante forma quindi la tua nuova "testa" della camminata casuale (ricorda di ricalcolare le lunghezze del percorso dalla sorgente del percorso) e puoi continuare.
Gli esperimenti dimostrano che così facendo non ha (o non ha ancora - vedi sotto) un ciclo di creazione di nuove code, a patto che se la tua nuova "coda" sia intrappolata, non solo ricreare senza cervello un collegamento con la cella da cui sei appena uscito se è il più recente - scegli il secondo più recente in quel caso.
Il caso di chiusura è quando ti trovi "bloccato" su un elemento di spigolo e hai riempito l'array (la lunghezza del percorso è la stessa dell'area dell'array) - hai finito. Il tuo punto di partenza porta al tuo punto finale.
Sembrano esserci due possibili inefficienze e potenziali singhiozzi con questo (sto giocando con l'algoritmo al momento) - A volte camminerai in un angolo e l'UNICO modo per continuare è ricreare il ciclo link con quello che hai appena rotto. Quindi la sequenza esegue il back-track attraverso tutti i loop che hai precedentemente fatto fino al punto in cui ti sei bloccato. Se che non può andare da nessun'altra parte (è un altro angolo), allora rimbalzerai tra i due. C'è un modo per aggirare questo, ma significa mantenere una sorta di elenco di celle in loop, solo cancellandolo quando si stabilisce effettivamente un nuovo percorso.
L'altro è che sembra incline a lasciare un quadrato dispari non riempito, in particolare quando l'array è dispari per dispari. Non ho studiato a fondo perché questo è il caso, ed è quando ciò accade che il problema dell'angolo precedente sembra particolarmente diffuso.Il lavoro continua ...
v'è alcuna restrizione, ad esempio no 2x2 black square? –
@Lie Ryan: No. Anche se sarebbe bello avere tali algoritmi tra le risposte. – Fejuto
Correlati: http://stackoverflow.com/questions/2641964/algorithm-to-generate-a-segment-maze – nico