1
Fork 0
This repository has been archived on 2025-04-09. You can view files and clone it, but cannot push or open issues or pull requests.
puzzle-wuzzle-generator/include/solver.hpp
2014-02-14 15:31:27 +01:00

52 lines
1.1 KiB
C++

#pragma once
#include "clusters.hpp"
#include <vector>
template <typename Grid>
struct Solution {
using Trace = std::vector<typename Grid::Position>;
Trace current_trace;
std::vector<Trace> solution_traces;
};
template <typename T>
auto pop(std::vector<T> & v){
v.erase(v.end()-1);
}
template <typename Grid, typename Rules>
auto solve_impl(Grid const & grid, Rules const & rules, Solution<Grid> & s){
// are we done yet?
for(auto&& p : grid.all_positions()){
if(!grid.empty(p)) goto analyse;
}
// yes -> record the solution
s.solution_traces.push_back(s.current_trace);
return;
// no -> try all clusters
analyse:
for(auto&& c : all_clusters(grid)){
if(c.size() < rules.min_cluster_size()) continue;
// remove the cluster
s.current_trace.push_back(*c.begin());
auto new_grid = make_empty(grid, c);
// recurse
solve_impl(new_grid, rules, s);
// go on with next cluster
pop(s.current_trace);
}
return;
}
template <typename Grid, typename Rules>
auto solve(Grid const & grid, Rules const & rules){
Solution<Grid> s;
s.current_trace.reserve(10);
solve_impl(grid, rules, s);
return s;
}