Problem: Given an initial maze, how can we find the finish
Example
#############
#+ ### #
# # ### # #
##### ### #
# ### #### #
# # ##
# ### #######
# # # ##
#F# # ## #
#############
First try right
#############
#++ ### #
# # ### # #
##### ### #
# ### #### #
# # ##
# ### #######
# # # ##
#F# # ## #
#############
...
#############
#+++++++### #
# # ### # #
##### ### #
# ### #### #
# # ##
# ### #######
# # # ##
#F# # ## #
#############
when you cannot try right, try left (unless that's been tried)
failing that, try up
next try down
#############
#+++++++### #
# # ###+ # #
##### ### #
# ### #### #
# # ##
# ### #######
# # # ##
#F# # ## #
#############
always try right whenever possible
#############
#+++++++### #
# # ###++# #
##### ### #
# ### #### #
# # ##
# ### #######
# # # ##
#F# # ## #
#############
if you reach a dead end, go back to the last intersection
#############
#+++++++### #
# # ###+ # #
##### ### #
# ### #### #
# # ##
# ### #######
# # # ##
#F# # ## #
#############
now try the next option (down)
#############
#+++++++### #
# # ###+ # #
##### +### #
# ### #### #
# # ##
# ### #######
# # # ##
#F# # ## #
#############
Continue the pattern:
After a few more moves:
#############
#+++++++### #
# # ###+ # #
#####+++### #
# ###+#### #
# +# ##
# ### #######
# # # ##
#F# # ## #
#############
SUCCESS
#############
#+++++++### #
# # ###+ # #
#####+++### #
# ###+#### #
#+++++# ##
#+### #######
#+# # ##
#F# # ## #
#############
with TEXT_IO;
procedure mazes is
package int_io is new TEXT_IO.INTEGER_IO(INTEGER);
use TEXT_IO,int_io;
LENGTH: constant integer:=13;
HEIGHT: constant integer:=10;
type mazes is array(1..LENGTH,1..HEIGHT) of character;
maze:mazes;
success:boolean:=false;
procedure getmaze(maze: out mazes) is
filevar: TEXT_IO.FILE_TYPE;
begin
open(FILE=>filevar,MODE=>IN_FILE,NAME=>"mazeinfo");
for y in 1..HEIGHT loop
for x in 1..LENGTH loop
get(filevar,maze(x,y));
end loop;
skip_line(filevar);
end loop;
close(filevar);
end getmaze;
procedure printmaze(maze: in mazes) is
begin
for y in 1..HEIGHT loop
for x in 1..LENGTH loop
put(maze(x,y));
end loop;
new_line;
end loop;
end;
procedure solvemaze(maze: in out mazes;
x,y : integer;
success:in out boolean) is
begin
printmaze(maze);
if (maze(x,y)='F') then
printmaze(maze);
success:=true;
end if;
maze(x,y):='+';
if (not success) and (maze(x+1,y)=' ' or maze(x+1,y)='F')
then solvemaze(maze,x+1,y,success);
end if;
if (not success) and (maze(x-1,y)=' ' or maze(x-1,y)='F')
then solvemaze(maze,x-1,y,success);
end if;
if (not success) and (maze(x,y-1)=' ' or maze(x,y-1)='F')
then solvemaze(maze,x,y-1,success);
end if;
if (not success) and (maze(x,y+1)=' ' or maze(x,y+1)='F')
then solvemaze(maze,x,y+1,success);
end if;
maze(x,y):=' ';
end;
begin
getmaze(maze);
Solvemaze(maze,2,2,success);
if (not success) then
printmaze(maze);
put_line("There is no solution to this maze");
else
put_line("Success");
end if;
end;