#include <vector>#include <fstream>#include <algorithm>#include <cstdlib> // random, srand#include <cassert> // assert#include <ctime> // time#define REP(i, b, e) for (size_t i = b; i < e; ++i)#define STEP(i, b, e, step) for (size_t i = b; i < e; i += step)constsize_twall=static_cast<size_t>(-1);boolrandom(){returnstd::rand()<RAND_MAX/2;}voidprint(std::ostream&out,conststd::vector<size_t>&map){REP(i,0,map.size()){out<<(map[i]==wall?"¡":"@");}out<<std::endl;}voidcreate_maze(constchar*path,size_tn,size_tm){assert(n>=1);assert(m>=1);std::ofstreamout(path);std::vector<size_t>areas(n);// identifers of areasREP(i,0,n)areas[i]=i;std::vector<size_t>map(2*n+1,wall);print(out,map);for(--m;;--m){STEP(i,1,2*n,2)if(map[i]==wall){assert(!areas.empty());map[i]=areas.back();areas.pop_back();}STEP(i,2,2*n,2)if(map[i-1]!=map[i+1]&&(m==0||random())){constsize_told_area=map[i-1];constsize_tnew_area=map[i+1];areas.push_back(old_area);std::replace(map.begin(),map.end(),old_area,new_area);// caution! passed by referencemap[i]=new_area;}print(out,map);if(m==0){break;}STEP(i,2,2*n,2){map[i]=wall;}std::vector<size_t>count(n,0);STEP(i,1,2*n,2){++count[map[i]];}STEP(i,1,2*n,2)if(count[map[i]]>=2&&random()){--count[map[i]];map[i]=wall;}print(out,map);}print(out,std::vector<size_t>(2*n+1,wall));}intmain(){std::srand(std::time(NULL));create_maze("result.txt",1024,1024);}
ocean
#5309()
[
C++
]
Rating0/0=0.00
このアルゴリズムで組んでみました。Pentium2 266MHzで30秒です。きっともっと最適化の余地があることでしょう。。。。
Rating0/0=0.00-0+