Files Classes Functions Hierarchy
00001 #ifndef MAZEMATRIXD2CREATEMAZE_H 00002 #define MAZEMATRIXD2CREATEMAZE_H 00003 00004 #include <queue> 00005 using namespace std; 00006 00007 #include <mazematrixD2.h> 00008 #include <point.h> 00009 #include <random.h> 00010 00011 00015 template< typename T > 00016 class mazematrixD2createmaze 00017 { 00018 public: 00019 00021 mazematrixD2<T> & mz; 00022 00024 deque< point2<T> > process; 00025 00027 mazematrixD2createmaze(mazematrixD2<T> & mz_) 00028 : mz(mz_) {} 00029 00031 void buildpropermaze(); 00032 00034 void impropermaze01(doublec deletewall); 00035 00036 }; 00037 00038 00039 //---------------------------------------------------------- 00040 // Implementation 00041 00042 00043 template< typename T > 00044 void mazematrixD2createmaze<T>::buildpropermaze() 00045 { 00046 T m=mz.dim[0]; 00047 T n=mz.dim[1]; 00048 00049 T i; 00050 T j; 00051 00052 i=1+(rand()%(m*n)); 00053 00054 process.clear(); 00055 vector< T > unvisited; 00056 00057 mz.neighboursunvisited(unvisited,i); 00058 random_shuffle(unvisited.begin(),unvisited.end()); 00059 assert(unvisited.size()!=0); 00060 process.push_back( point2<T>(i,unvisited[0]) ); 00061 00062 point2<T> current; 00063 00064 bool res; 00065 for ( ; !process.empty(); ) 00066 { 00067 current = process.front(); 00068 process.pop_front(); 00069 00070 i = current.x; 00071 j = current.y; 00072 //cout << "(" << i << "," << j << ")" << endl; 00073 00074 if (mz.vi[j].unvisited()) 00075 { 00076 mz.linkadjacent(res,i,j); 00077 assert(res); 00078 00079 mz.neighboursunvisited(unvisited,j); 00080 random_shuffle(unvisited.begin(),unvisited.end()); 00081 00082 /* 00083 cout << j << ": "; 00084 for (uint k=0; k<unvisited.size(); ++k) 00085 cout << unvisited[k] << " "; 00086 cout << endl; 00087 */ 00088 00089 //random_shuffle(unvisited.begin(),unvisited.end()); 00090 if (unvisited.size()!=0) 00091 { 00092 process.push_front( point2<T>(j,unvisited[0]) ); 00093 for (uint k=1; k<unvisited.size(); ++k) 00094 process.push_back( point2<T>(j,unvisited[k]) ); 00095 } 00096 } 00097 00098 /* 00099 cout << "process: "; 00100 typename deque< point2<T> >::iterator i2; 00101 i2=process.begin(); 00102 for ( ; i2!=process.end(); ++i2) 00103 cout << *i2 << " "; 00104 cout << endl; 00105 */ 00106 00107 } 00108 00109 } 00110 00111 00112 template< typename T > 00113 void mazematrixD2createmaze<T>::impropermaze01(doublec deletewall) 00114 { 00115 assert(deletewall<1.0); 00116 assert(deletewall >= 0.0); 00117 00118 T m=mz.dim[0]; 00119 T n=mz.dim[1]; 00120 T mn=m*n; 00121 00122 vector<T> ki(mn); 00123 00124 for (T i=0; i<mn; ++i) 00125 ki[i]=i+1; 00126 00127 // Help randomize things a bit, may not matter. 00128 random_shuffle(ki.begin(),ki.end()); 00129 00130 T k2; 00131 bool res; 00132 00133 random11<> r; 00134 00135 for (T i=0; i<mn; ++i) 00136 { 00137 00138 for (uint j=0; j<4; ++j) 00139 { 00140 if (mz.vi[ki[i]].ni[j]!=0) 00141 continue; 00142 00143 mz.move(res,k2,j,ki[i]); 00144 if (res==false) 00145 continue; 00146 00147 if (r()<deletewall) 00148 { 00149 mz.linkadjacent(res,k2,ki[i]); 00150 assert(res==true); 00151 } 00152 } 00153 } 00154 } 00155 00156 00157 00158 00159 #endif 00160 00161
1.5.8