1
Fork 0
This repository has been archived on 2025-04-09. You can view files and clone it, but cannot push or open issues or pull requests.
puzzle-wuzzle-generator/include/solver.hpp
2014-02-16 11:36:19 +01:00

52 lines
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){
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 <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;
}