About
Creating code for labyrinth solvers is a quite traditional exercise. The following snippets provide versions in Python and in C of a concise labyrinth solver.
Sample output
When run with the sample maze, the Python version will output the following result:
############### B+# # # # #+# ### ### # # #+# #+++++++# # #+#+++### #+# # #+#+#.# #+#+F #+++#.# # #+#+# #####.# # #+#+# #.....# # #+++# ###############
Snippet in Python
NONE, WALL, BEGN, FNSH, SEEN, GOOD = tuple(' #BF.+') SAMPLE = """ ############### B # # # # # # ### ### # # # # # # # # # ### # # # # # # # # # F # # # # # # # ##### # # # # # # # # # # ############### """ def solve(maze, posx, posy, sizex, sizey): found = 0 if 0 <= posx < sizex and 0 <= posy < sizey: if maze[posy][posx] in (NONE, BEGN): if maze[posy][posx] == NONE: maze[posy][posx] = SEEN if (solve(maze, posx+1, posy, sizex, sizey) or solve(maze, posx-1, posy, sizex, sizey) or solve(maze, posx, posy+1, sizex, sizey) or solve(maze, posx, posy-1, sizex, sizey)): if maze[posy][posx] == SEEN: maze[posy][posx] = GOOD found = 1 elif maze[posy][posx] == FNSH: found = 1 return found def main(): maze = [list(x) for x in SAMPLE.splitlines() if x] solve(maze, 0, 1, len(maze[0]), len(maze)) for line in maze: print "".join(line) if __name__ == "__main__": main()
Snippet in C
#include <stdio.h> #define NONE 0 #define WALL 1 #define BEGN 2 #define FNSH 3 #define SEEN 4 #define GOOD 5 #define SIZEX 15 #define SIZEY 10 int maze[SIZEY][SIZEX] = { {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}, {2,0,1,0,0,0,0,0,1,0,0,0,1,0,1}, {1,0,1,0,1,1,1,0,1,1,1,0,1,0,1}, {1,0,1,0,1,0,0,0,0,0,0,0,1,0,1}, {1,0,1,0,0,0,1,1,1,0,1,0,1,0,1}, {1,0,1,0,1,0,1,0,0,0,1,0,1,0,3}, {1,0,0,0,1,0,1,0,1,0,1,0,1,0,1}, {1,1,1,1,1,0,1,0,1,0,1,0,1,0,1}, {1,0,0,0,0,0,1,0,1,0,1,0,0,0,1}, {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1} }; int _solve(int maze[SIZEY][SIZEX], int posx, int posy) { int found = 0; if (posx >= 0 && posx < SIZEX && posy >= 0 && posy < SIZEY) { int curpos = maze[posy][posx]; if (curpos == NONE || curpos == BEGN) { if (curpos == NONE) maze[posy][posx] = SEEN; if (_solve(maze, posx+1, posy) || _solve(maze, posx, posy+1) || _solve(maze, posx, posy-1) || _solve(maze, posx-1, posy)) { if (curpos == NONE) maze[posy][posx] = GOOD; found = 1; } } else if (curpos == FNSH || curpos == GOOD) { found = 1; } } return found; } int solve(int maze[SIZEY][SIZEX]) { int x, y; int found = 0; for (y = 0; y < SIZEY; y++) for (x = 0; x < SIZEX; x++) if (maze[y][x] == BEGN) found |= _solve(maze, x, y); return found; } void print(int maze[SIZEY][SIZEX]) { int x,y; for (y = 0; y < SIZEY; y++) { for (x = 0; x < SIZEX; x++) printf("%d ", maze[y][x]); printf("\n", maze[y][x]); } } int main() { solve(maze); print(maze); return 0; } /* vim:ts=4:sw=4:et */