#include #include #include "Array.h" #include "Hash.h" #include "Graph.h" #include "UnionFind.h" #include "Maze.h" #include "test_utilities.h" #define DEBUG(x) //#define DEBUG(x) x int main() { Maze m; std::cin >> m; const Graph & g = m.graph(); Array vertex_ids = g.vertices(); int start_vertex = m.get_start_vertex(); int end_vertex = m.get_end_vertex(); HashTable components(NULL); components[start_vertex] = new UnionFind; components[end_vertex] = new UnionFind; if (g.edge_exists(start_vertex,end_vertex)) components[start_vertex]->merge(*components[end_vertex]); DEBUG(std::cerr << "vertices:\n" << vertex_ids << std::endl;); // randomly permute the vertices for (int i = 1; i < vertex_ids.size(); ++i) { int j = random() % (i+1); if (i != j) { int tmp = vertex_ids[i]; vertex_ids[i] = vertex_ids[j]; vertex_ids[j] = tmp; } } DEBUG(std::cerr << "permuted vertices:\n" << vertex_ids << std::endl;) for (int i = 0; i < vertex_ids.size(); ++i) { int v = vertex_ids[i]; if (i % 100 == 99) std::cerr << "."; DEBUG(std::cerr << "considering vertex " << v << std::endl;); if (components[v]) continue; DEBUG(std::cerr << "(doesn't yet exist)" << std::endl;); Array built_nbrs; Array nbr_comps; { HashTable nbr_comps_hash; Array nbrs = g.nbrs(v); for (int j = 0; j < nbrs.size(); ++j) { int w = nbrs[j]; if (components[w]) { built_nbrs[built_nbrs.size()] = w; nbr_comps_hash[components[w]->find()]; } nbr_comps = nbr_comps_hash.keys(); } } DEBUG(std::cerr << built_nbrs.size() << " neighbors with " << nbr_comps.size() << " components" << std::endl;); // if # nbrs <= 1 add cell // or if # nbr_comps > 1 add cell if (built_nbrs.size() <= 1 || nbr_comps.size() > 1) { // or, if #nbrs == #comps add cell //if (built_nbrs.size() == nbr_comps.size()) { DEBUG(std::cerr << "adding cell" << std::endl;); components[v] = new UnionFind; for (int j = 0; j < nbr_comps.size(); ++j) { DEBUG(std::cerr << "merging v's component with " << j << "th neighboring component"<< std::endl;); components[v]->merge(*nbr_comps[j]); } DEBUG(std::cerr << "number of components is now " << UnionFind::n_components() << std::endl;); } } std::cerr << std:: endl; for (int i = 0; i < vertex_ids.size(); ++i) { int v = vertex_ids[i]; if (! components[v]) { DEBUG(std::cerr << "erasing vertex " << v << std::endl;); Array loc = m.loc_of_vertex(v); m.set_text_at(loc[0], loc[1], ' '); } } std::cout << m; }