00001 #ifndef __MAZE_H__ 00002 #define __MAZE_H__ 00003 00004 #pragma once 00005 00006 #include "DisjointSets.h" 00007 00008 class Maze { 00009 private: 00010 int ** cell; 00011 int width, height; 00012 00013 DisjointSets sets; 00014 00015 void allocate() { 00016 cell = new int* [height]; 00017 for (int i = 0; i < height; i++) { 00018 cell[i] = new int[width]; 00019 for (int j = 0; j < width; j++) { 00020 cell[i][j] = 1; 00021 } 00022 } 00023 } 00024 00025 inline void merge_rooms_of(int x1, int y1, int x2, int y2) { 00026 sets.merge_sets_of(x1 * width + y1, x2 * width + y2); 00027 } 00028 00029 public: 00035 Maze(int width, int height) : width(width), height(height), sets(width*height) { 00036 allocate(); 00037 } 00038 00039 ~Maze() { 00040 for (int i = 0; i < height; i++) { 00041 delete[] cell[i]; 00042 } 00043 delete[] cell; 00044 } 00045 00049 void clear_wall(int x, int y) { 00050 cell[x][y] = 0; 00051 if (x > 0 && cell[x-1][y] == 0) merge_rooms_of(x - 1, y, x, y); 00052 if (y > 0 && cell[x][y-1] == 0) merge_rooms_of(x, y - 1, x, y); 00053 if (x+1 < height && cell[x+1][y] == 0) merge_rooms_of(x + 1, y, x, y); 00054 if (y+1 < width && cell[x][y+1] == 0) merge_rooms_of(x, y + 1, x, y); 00055 } 00056 00062 inline bool same_room(int x1, int y1, int x2, int y2) { 00063 return sets.same_set(x1 * width + y1, x2 * width + y2); 00064 } 00065 00071 inline int get_room_ID(int x, int y) { 00072 return sets.get_ID(x * width + y); 00073 } 00074 00079 inline int get_width() { 00080 return width; 00081 } 00082 00087 inline int get_height() { 00088 return height; 00089 } 00090 00091 friend std::ostream& operator << (std::ostream &, const Maze &); 00092 }; 00093 00094 #endif 00095