diff --git a/include/generator.hpp b/include/generator.hpp index cb0ba57..51c9050 100644 --- a/include/generator.hpp +++ b/include/generator.hpp @@ -7,7 +7,7 @@ namespace detail { template auto random_field(URNG&& r, std::index_sequence){ - std::uniform_int_distribution dis(0, 4); + std::uniform_int_distribution dis(1, 2); return create_rectangular_field({ ((void)I, dis(r))... }); diff --git a/include/solver.hpp b/include/solver.hpp index 5dc2eb4..1c2cbea 100644 --- a/include/solver.hpp +++ b/include/solver.hpp @@ -1,9 +1,15 @@ #pragma once #include "clusters.hpp" +#include template -auto solve(Field const & field){ +struct Solution { + std::deque taps; +}; + +template +auto solve_impl(Field const & field, Solution & s){ for(auto&& p : field.all_positions()){ if(!field.empty(p)) goto analyse; } @@ -11,9 +17,19 @@ auto solve(Field const & field){ analyse: for(auto&& c : all_clusters(field)){ - if(c.size() < 2) continue; + if(c.size() < 3) continue; auto new_field = make_empty(field, c); - if(solve(new_field)) return true; + if(solve_impl(new_field, s)) { + s.taps.push_front(*c.begin()); + return true; + } } return false; } + +template +auto solve(Field const & field){ + Solution s; + solve_impl(field, s); + return s; +} diff --git a/main.cpp b/main.cpp index 8431dcb..ab16448 100644 --- a/main.cpp +++ b/main.cpp @@ -9,24 +9,19 @@ #include #include -template -auto is_void(Field const & field){ - for(auto&& p : field.all_positions()){ - if(!field.empty(p)) return false; - } - return true; -} - int main(){ using namespace std; std::random_device rd; std::mt19937 gen(rd()); - auto field = random_field<5, 5>(gen); + std::cout << std::endl; + auto field = random_field<3, 3>(gen); field.print(std::cout); - cout << solve(field) << std::endl; + auto solution = solve(field); + for(auto&& t : solution.taps){ + std::cout << "(" << t.first << ", " << t.second << ")\n"; + } } -