A-M baby
This commit is contained in:
parent
764da6cbbb
commit
db842d013d
19005 changed files with 197040 additions and 7 deletions
13
Task/Maze-solving/Icon/maze-solving-1.icon
Normal file
13
Task/Maze-solving/Icon/maze-solving-1.icon
Normal file
|
|
@ -0,0 +1,13 @@
|
|||
procedure main(A)
|
||||
/mh := \A[1] | 12
|
||||
/mw := \A[2] | 16
|
||||
mz := DisplayMaze(GenerateMaze(mh,mw))
|
||||
WriteImage(mz.filename) # save file
|
||||
WAttrib(mz.window,"canvas=normal") # show it
|
||||
until Event() == &lpress # wait for left mouse press
|
||||
Solver(mz.maze)
|
||||
DisplayMazeSolution(mz)
|
||||
WriteImage(mz.filename ?:= (="maze-", "maze-solved-" || tab(0)))
|
||||
until Event() == &lpress # wait
|
||||
close(mz.window)
|
||||
end
|
||||
37
Task/Maze-solving/Icon/maze-solving-2.icon
Normal file
37
Task/Maze-solving/Icon/maze-solving-2.icon
Normal file
|
|
@ -0,0 +1,37 @@
|
|||
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
|
||||
Loading…
Add table
Add a link
Reference in a new issue