#include
#include
#include
class Maze {
private:
int rows, columns;
std::vector > mat;
public:
Maze(int _rows = 2, int _columns = 2) {
rows = _rows;
columns = _columns;
mat.resize(rows);
for(int i = 0; i < rows; i++) {
mat.at(i).resize(columns);
}
for(int i = 0; i < rows; i++) {
for(int j = 0; j < columns; j++) {
mat.at(i).at(j) = '#';
}
}
}
int get_rows() const {
return rows;
}
int get_columns() const {
return columns;
}
void set_value(int i, int j, char new_value) {
mat.at(i).at(j) = new_value;
}
void print() {
for(int i = 0; i < rows; i++) {
for(int j = 0; j < columns; j++) {
std::cout << mat.at(i).at(j) ;
}
std::cout << std::endl;
}
}
char get_position(int i, int j) {
return mat.at(i).at(j);
}
};
class RandomMaze {
private:
Maze maze;
std::vector > visited;
std::vector di{-1, 1, 0, 0};
std::vector dj{0, 0, -1, 1};
public:
RandomMaze(Maze _maze) {
maze = _maze;
visited.resize(maze.get_rows());
for(int j = 0; j < maze.get_rows(); j++) {
visited.at(j).resize(maze.get_columns(), false);
}
}
void generate_random_maze(int ii, int jj) {
visited[ii][jj] = true;
std::vector > v;
for(int i = 0; i < 4; i++) {
int ti = di.at(i) + ii;
int tj = dj.at(i) + jj;
if(ti >= 0 and ti < maze.get_rows() and tj >= 0 and tj < maze.get_columns() and !visited.at(ti).at(tj)) {
v.push_back(std::make_pair(ti, tj));
}
}
std::random_shuffle(v.begin(), v.end());
for(std::pair p : v) {
maze.set_value(p.first, p.second, '.');
generate_random_maze(p.first, p.second);
}
visited[ii][jj] = false;
}
Maze get_maze() {
return maze;
}
};
int main(int argc, char *argv[])
{
int seed = -1;
int n, m;
if(argc > 2) {
n = atoi(argv[1]);
m = atoi(argv[2]);
}
if(argc == 3) {
seed = atoi(argv[3]);
}
if(seed == -1) {
srand(time(0));
}
else {
srand(seed);
}
n = 5;
m = 5;
Maze maze(n, m);
RandomMaze random_maze(maze);
random_maze.generate_random_maze(0, 0);
random_maze.get_maze().print();
return 0;
}