procedure Solver(r,c) static maze,h,w,rd if type(r) == "list" then { # ------------------- Top Level (r == maze) h := *(maze := r) # height w := *maze[1] # width every r := 1 to h & c := 1 to w do # remove breadcrumbs maze[r,c] := iand(maze[r,c],NORTH+EAST+SOUTH+WEST+START+FINISH) every ((r := 1 | h) & (c := 1 to w)) | # search perimiter ((r := 1 to h) & (c := 1 | w)) do if iand(maze[r,c],START) > 0 then break # until start found Solver(r,c) # recurse through maze return 1(.maze,maze := &null) # return maze and reset } else # ------------------- Recurse way through maze if iand(x := maze[r,c],SEEN) = 0 then { # in bounds and not seen? (iand(x,FINISH) > 0, maze[r,c] +:= PATH, return ) # at finish? - done! maze[r,c] +:= SEEN # drop bread crumb (iand(x,NORTH) > 0, Solver(r-1,c), maze[r,c] +:= PATH, return) (iand(x,EAST) > 0, Solver(r,c+1), maze[r,c] +:= PATH, return) (iand(x,SOUTH) > 0, Solver(r+1,c), maze[r,c] +:= PATH, return) (iand(x,WEST) > 0, Solver(r,c-1), maze[r,c] +:= PATH, return) } end procedure DisplayMazeSolution(mz) #: draw marked PATH &window := mz.window maze := mz.maze WAttrib("dx="||(dxy:=BORDER+CELL/2),"dy="||dxy) every (r := 1 to *maze) & (c := 1 to *maze[1]) do { if fg ~=== "blue" then Fg(fg := "blue") if iand(maze[r,c],START) > 0 then Fg(fg := "red") if iand(maze[r,c],PATH) > 0 then FillCircle(x := CELL*(c-1),y := CELL*(r-1),rad := CELL/5) } return mz end