Rat in Maze

/***
Rat in a Maze
A Maze is given as N*N binary matrix of blocks where source block is the upper left most block i.e., maze[0][0] and destination block is lower rightmost block i.e., maze[N-1][N-1]. A rat starts from source and has to reach destination. The rat can move only in two directions: forward and down.
In the maze matrix, 0 means the block is dead end and 1 means the block can be used in the path from source to destination. Note that this is a simple version of the typical Maze problem. For example, a more complex version can be that the rat can move in 4 directions and a more complex version can be with limited number of moves.
IDEA: Similar with Robot walking. Start from maze[N-1][N-1], find the path back to maze[0][0]. check the validation before move. maze[m][n], two direction,maze[m-1][n] and maze[m][n-1].
***/

#include<iostream>
#include<vector>

using namespace std;

#define N 4 //width of Maze

struct point {
       int x,y;
       point(int m, int n) {
              this->x = m;
              this->y = n;
       }
};

class rat_inMaze {
public:
       rat_inMaze(bool (*m)[N]);
       ~rat_inMaze();
       void find_Path(int, int, vector<point>);
       void print();
private:
       bool check(int, int);
       bool maze[N][N];
       vector<vector<point>> paths;
};

rat_inMaze :: rat_inMaze(bool (*m)[N]) {
       for(int i = 0; i<N; i++) {
              for(int j = 0; j<N; j++)
                     maze[i][j] = m[i][j];
       }
       paths.clear();
}

rat_inMaze :: ~rat_inMaze() {
       paths.clear();
}

bool rat_inMaze :: check(int m, int n) {
       if(maze[m][n]) return true;
       else return false;
}

void rat_inMaze :: find_Path(int m, int n, vector<point> path) {
       if(m == 0 && n == 0) {
              point p(m, n);
              path.push_back(p);
              paths.push_back(path);
              return;
       }

       if(m < 0 || n < 0) return;

       if(check(m, n)) {
              point p(m, n);
              path.push_back(p);
              find_Path(m-1, n, path);
              find_Path(m, n-1, path);
              path.pop_back();
       } else return;
}

void rat_inMaze :: print() {
       for(int i = 0; i<paths.size(); i++) {
              for(int j = 0; j<paths[i].size(); j++)
                     cout<<"("<<paths[i][j].x <<", "<<paths[i][j].y<<"), ";
              cout<<endl;
       }
}

void main() {
       bool maze[][N]  =  {
       {1, 0, 0, 0},
       {1, 1, 0, 1},
       {0, 1, 0, 0},
       {1, 1, 1, 1}
       };

       rat_inMaze rat(maze);
       vector<point> p;
       rat.find_Path(N-1, N-1, p);
       rat.print();

}

Comments

Popular posts from this blog

Sudoku

Longest prefix matching - trie

Climbing Stairs