#pragma once #include "clusters.hpp" #include template struct Solution { using Trace = std::vector; Trace current_trace; std::vector solution_traces; }; template auto pop(std::vector & v){ v.erase(v.end()-1); } template auto solve_impl(Grid const & grid, Rules const & rules, Solution & 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 auto solve(Grid const & grid, Rules const & rules){ Solution s; s.current_trace.reserve(10); solve_impl(grid, rules, s); return s; }