#pragma once #include "data.hpp" #include "clusters.hpp" #include template struct State { using Trace = typename Solutions::Trace; Trace trace; // current trace being considered }; template auto pop(std::vector & v){ v.erase(v.end()-1); } template auto solve_impl(Grid const & grid, Rules const & rules, State & state, Solutions & solutions){ if(grid.empty()){ // solved path solutions.traces.push_back(state.trace); return; } auto&& clusters = all_clusters(grid, rules); if(clusters.empty()){ // unsolvable path return; } for(auto&& c : clusters){ // remove the cluster state.trace.push_back(*c.begin()); auto new_grid = make_empty(grid, c); // recurse solve_impl(new_grid, rules, state, solutions); // go on with next cluster pop(state.trace); } return; } template auto solve(Grid const & grid, Rules const & rules){ Solutions solutions; State state; state.trace.reserve(10); solve_impl(grid, rules, state, solutions); return solutions; }