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
Post a Comment