1. ## Shortest Path Maze Solver (Breadth Search Help)

Hullo. My latest assignment in computar class has me trying to create a maze solver. Now it is not necessary for the computer to solve for the shortest path, however there are delicious extra marks if it does. I've already figured out how to solve the maze - using the recursive backtracking technique. I know a breadth search is used to find the shortest path in a maze solving problem. However I am having great trouble in trying to implement this algorithm (recursively).

Now, this isn't done in the C programming language, its suppose to be done in Java. But the syntax is so similar you can post C code and I'll be able to tell what it is.

Here's what I have so far (this is the recursive method).

The maze is broken up into 'nodes'

Maze: (S is start X is exit * is path and B is border)
BBBBBBB
B****BB
X***SBB
BBBBBBB

Nodes:
'0' '1' '2' '3' '4' '5' '6'
'7' '8' '9' '10' '11' '12' '13'
'14' '15' '16' '17' '18' '19' '20'
'21' '22' '23' '24' '25' '26' '27'

Now you start at S and place that node into an array specifically meant to hold nodes. Then you look up, down, left, and right for any 'path' symbols. If there is path symbol, place it in a que array. Then recursively call the method turning the recently discovered que into the new node. Continue until exit is found. I've tried doing this but it doesn't work. It will find the exit, but it is not the shortest path. Is there something I'm missing from the algorithm? I'm having some trouble understanding the algorithm, this is what I've got out of it so far. 2. Do you have to use breadth first search?

In my (limited) experience, it's a pita, and noticeably slower than using depth first search, despite what you read in theory books.

I'm confident we can find the shortest path with it.

I'll post up a little example of it, in an edit to this, and see if you're not *really* tempted by it. This is a DFS on a "simple" 8 digit slide puzzle.

Code:
```/* Will solve via brute force, the 8 tile 2D "rubik's cube" puzzle, when finished

Status: just started 7/11/08
*/

#include <stdio.h>

void copyB(int);
int move1(int);
int move2(int);
int move3(int);

void showB(int);
int isSolved(int);

int b;    //b is shorthand for the board
int t;        //t is a temporary holding row
int line;       //the line of moves that are played

int main(void)  {
int i, r, row, c, col, move, deep, depth, solved, reset, gar;
// test right shift
/*   b = 2; b = 3; b = 4; b = 1;
b = 7; b = 6; b = 5; b = 8;
*/
// test row swap
/*   b = 8; b = 7; b = 6; b = 5;
b = 1; b = 2; b = 3; b = 4;
*/
// test Rotate 4 inner tiles
/*   b = 1; b = 3; b = 6; b = 4;
b = 8; b = 2; b = 7; b = 5;
*/
// test depth of 2, solution 1 + 2
/*   b = 7; b = 6; b = 5; b = 8;
b = 2; b = 3; b = 4; b = 1;
*/
//test depth of 2, solution 2 + 3  no depth=2 solution found for 1+3
b = 8; b = 2; b = 7; b = 5;
b = 1; b = 3; b = 6; b = 4;

//test depth of , solution
/*   b = ; b = 2; b = 1; b = 4;
b = 8; b = 7; b = 6; b = 5;
*/
printf("\n Starting position:\n");
showB(0);
//getch();
depth = deep = solved = reset = 0;

do  {
move = 1; depth = 2;

while(1)  {   // this is the main loop, for now
++deep;
if(move == 1)
solved = move1(deep);
else if(move == 2)
solved = move2(deep);
else
solved = move3(deep);

if(solved)
break;

if(reset)  {    //depth was reset, move needs to reset to 1 again
move = 1;
reset = 0;
continue;
}

if(deep >= depth)  {
line[deep-1] = 0;
deep = depth - 1;
if(++move > 3) {
deep -= 1;
move = line[deep] + 1;
if(move > 1)
reset = 1;
}
}
}

}while(!solved);

printf("\n\n\t Press Enter to Quit\n ");
gar = getchar(); gar++;
return 0;
}
void copyB(int d)  {  //copy the old board position, into the new depth
int r, c, temp;

for(r = 0; r < 2; r++)
for(c = 0; c < 4; c++)
b[r][c][d] = b[r][c][d-1];
}
int move1(int d)  {  //shifts all numbers one column to the right &  wraps
int r, c, solved, temp;
solved = 0;
printf("\n Right shift:");
copyB(d);
//showB(d);
//++d;

for(r = 0; r < 2; r++)  {
temp = b[r][d];
for(c = 2; c >-1 ; c--)
b[r][c+1][d] = b[r][c][d];
b[r][d] = temp;
}

showB(d);
line[d-1] = 1;
solved = isSolved(d);

return solved;
}
int move2(int d)  { //swaps rows
int r, c, solved;
solved = 0;
printf("\n Swap rows:");
copyB(d);
//showB(d);

for(c = 0; c < 4; c++)  {
t[c] = b[c][d];
b[c][d] = b[c][d];
b[c][d] = t[c];
}

showB(d);
line[d-1] = 2;
solved = isSolved(d);

return solved;
}
int move3(int d) { //turns the 4 inner tiles, clockwise
int r, c, solved, temp;
solved = 0;
printf("\n Rotate 4 inner tiles:");
copyB(d);
//showB(d);

temp = b[d];
b[d] = b[d];
b[d] = b[d];
b[d] = b[d];
b[d] = temp;

showB(d);
line[d-1] = 3;
solved = isSolved(d);

return solved;
}
void showB(int d)   {
int r, c, tab;
printf("\n");
for(tab = 0; tab < d; tab++)
putchar('\t');
for(r = 0; r < 2; r++) {
for(c = 0; c < 4; c++)
printf(" %d", b[r][c][d]);
putchar('\n');
for(tab = 0; tab < d; tab++)
putchar('\t');
}
}
int isSolved(int d)  {
int i, gar;
int done = 0;
if(b[d]==1 && b[d]==2 && b[d]==3 && b[d]==4)
if(b[d]==8 && b[d]==7 && b[d]==6 && b[d]==5)  {
done = 1;
printf("\n\n\t\t It's solved!");
showB(d);
printf("\t Line: ");
for(i = 0; i < d; i++)
printf(" %d", line[i]);

//printf("\n\t Press Enter to Continue");
//gar = getchar(); ++gar;
}

return done;
}``` 3. Yes a breadth-first search is essentially going to find the shortest path, but it will be very slow!
To speed it up, rather than examining all paths of length n before those of length n+1, you have a heuristic that biases it towards following those paths that are getting you measurably closer to the goal. This is the basic idea behind the algorithm called A*. That algorithm is what you need to read up on. 4. I got it to work Turns out there was a lot more involved then I thought there was. We didn't have to use breadth first search I just decided on that one because it seemed to be the easiest out of the 'find the quickest route' bunch. Thanks for the suggestions and thanks Adak for the code on depth, I'll sure use it for reference. 5. Well done, R Man! 6. BFS is a really fun exercise. You could have really wowed your professor if you had let them pick which method they wanted to use from a menu. Anyway, back to BFS:
Code:
```add the starting point to the first list
while not at the exit
for each room in one list
if not exit
add its neighbors to the other list
else
return the shortest path
swap lists```
Quzah. Popular pages Recent additions 