52 lines
1.1 KiB
C++
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;
|
|
}
|