#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){ if(grid.empty()){ // solved path s.solution_traces.push_back(s.current_trace); return; } auto&& clusters = all_clusters(grid, rules); if(clusters.empty()){ // unsolvable path return; } for(auto&& c : clusters){ // 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; }