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