1 #include <iostream> 2 #include <list> 3 #include <stdlib.h> 4 #define n 6 //size of maze 5 using namespace std; 6 7 int grid[n+2][n+2]; //we set the border for the maze 8 struct position //this struct is used to record the path 9 { 10 int row; 11 int col; 12 position(int a, int b) //constructor function 13 { 14 row = a; 15 col = b; 16 } 17 18 position() 19 { 20 } 21 bool isEqualWith(position &another) //determine whether two struction is equal 22 { 23 if(row==another.row&&col==another.col) 24 return true; 25 else 26 return false; 27 } 28 }; 29 30 bool findPath(position start, position finish, int &PathLen, position *&path) //pathlen is the len of the path, path is the array record path; 31 { 32 if(start.isEqualWith(finish)) //if the atart point is equal to finish point, we end the function 33 { 34 PathLen=0; 35 cout << "start point is the same as end point"; 36 return true; 37 } 38 39 for(int i=0; i<=n+1; i++) //set wall for maze 40 { 41 grid[0][i] = grid[n+1][i] = -2; 42 } 43 for(int i=0; i<=n+1; i++) 44 { 45 grid[i][0] = grid[i][n+1] = -2; 46 } 47 48 position offset[4]; 49 offset[0].col = 1; 50 offset[0].row = 0; //the direction is right 51 offset[1].col = 0; 52 offset[1].row=1; //the direction is down 53 offset[2].col = -1; 54 offset[2].row = 0; //left 55 offset[3].col = 0; 56 offset[3].row = -1; //up 57 58 int numofNbr = 4; //the number of directins 59 position here, nbr; // here is the extension box, nbr is the extended square 60 here.row = start.row; //we explore the target from the start point 61 here.col = start.col; 62 grid[start.row][start.col] = 0; //the distance of start point is zero 63 list <position> Q; //queue 64 while(true) 65 { 66 for(int i=0; i<numofNbr; i++) 67 { 68 nbr.row = here.row + offset[i].row; 69 nbr.col = here.col + offset[i].col; 70 if(grid[nbr.row][nbr.col]==-1) //if the node can be extended, we push if into Q, and set the distance of it to one; 71 { 72 grid[nbr.row][nbr.col] = grid[here.row][here.col] + 1; 73 Q.push_back(nbr); 74 } 75 if(nbr.row==finish.row&&nbr.col==finish.col) //when we find the target, we get out of tha circulation, i use the goto sentence, because the break sentence can only jump out one level circulation, the offical explanation for break statement is "A break causes the innermost enclosing loop or switch to be exited immediately." 76 goto next; 77 } 78 if(Q.empty()) 79 return false; 80 here = Q.front(); 81 Q.pop_front(); 82 } 83 84 next: PathLen = grid[finish.row][finish.col]; 85 path = (position*)malloc(sizeof(position)*PathLen+1); //the length of path is pathlen+1, because the position information we need to record is pethlen+1 86 here = finish; 87 for(int j=PathLen; j>=0; j--) 88 { 89 path[j]=here; 90 for(int i=0; i<numofNbr; i++) 91 { 92 nbr.row = here.row + offset[i].row; 93 nbr.col = here.col + offset[i].col; 94 if(grid[nbr.row][nbr.col]==j-1) //if the neighboring point value is equal to the value of now minus 0ne, the neighboring point is last point we need to find 95 break; 96 } 97 here = nbr; 98 } 99 100 return true; 101 } 102 int main() 103 { 104 for(int i=0; i<n+2; i++) 105 for(int j=0; j<n+2; j++) 106 { 107 grid[i][j]=-1; 108 } 109 110 grid[4][5]=-2; 111 int a; 112 position* path = NULL; 113 findPath(position(4,4), position(4,6), a, path); 114 for(int i=0; i<a+1; i++) 115 { 116 cout << path[i].row << " " << path[i].col << endl; 117 } 118 return 0; 119 }