From 7b3aa9c871ff1f6c659504aa8bbc162ec4696e09 Mon Sep 17 00:00:00 2001 From: Daniel Ledda Date: Sat, 19 Nov 2022 15:57:19 +0100 Subject: [PATCH] added old backtrack algo --- main.cpp | 36 ++++++++++++++++++++++++++++++------ 1 file changed, 30 insertions(+), 6 deletions(-) diff --git a/main.cpp b/main.cpp index 68bb929..c4bb4f9 100644 --- a/main.cpp +++ b/main.cpp @@ -1,9 +1,11 @@ +#include #include #include +#include #include #include "VoxelSpace.h" -auto backtrack_solve(std::vector *polycube_input, std::vector *offsets)-> void { +auto backtrack_solve_iter(std::vector *polycube_input, std::vector *offsets)-> void { auto num_inputs = offsets->size() - 1; auto solns = std::vector(); @@ -51,6 +53,25 @@ auto backtrack_solve(std::vector *polycube_input, std::vector *of std::cout << "Done. Found " << solns.size() << " solutions." << std::endl; } +auto backtrack_solve(std::vector *polycube_input, std::vector *offsets, uint64_t working_solution = 0ull, int set = 0) -> int { + auto solns = 0; + auto start = offsets->at(set); + auto end = offsets->at(set + 1); + std::cout << start << " " << end << "\n"; + for (int i = start; i < end; i++) { + auto successful_fuse = (working_solution | polycube_input->at(i)) == (working_solution ^ polycube_input->at(i)); + if (successful_fuse) { + working_solution = working_solution | polycube_input->at(i); + if (set == offsets->size() - 2) { + return solns + 1; + } else { + solns += backtrack_solve(polycube_input, offsets, working_solution, set + 1); + } + } + } + return solns; +} + auto get_dims_input(int dims[3]) -> void { std::cout << "Enter dimensions separated by newlines. (x*y*z must not exceed 64)\n"; auto success = false; @@ -109,8 +130,8 @@ auto get_reprs_input(int units_required) -> std::vector { } auto main() -> int { - int dims[3] = {}; - get_dims_input(dims); + int dims[3] = { 3, 3, 3 }; + //get_dims_input(dims); std::cout << '\n'; //auto reprs = get_reprs_input(dims[0]*dims[1]*dims[2]); auto reprs = std::vector{ @@ -137,7 +158,6 @@ auto main() -> int { auto space = model_space; space.space = reprs[0]; Voxel::cullEmptySpace(&space); - std::cout << space.dims[0] << space.dims[1] << space.dims[2] << std::endl; auto positions = Voxel::getUniqueRotations(&space); polycubes.insert(polycubes.end(), positions.begin(), positions.end()); @@ -146,13 +166,17 @@ auto main() -> int { auto space = model_space; space.space = reprs[i]; Voxel::cullEmptySpace(&space); - std::cout << space.dims[0] << space.dims[1] << space.dims[2] << std::endl; auto perms = Voxel::getUniqueRotations(&space); polycubes.insert(polycubes.end(), perms.begin(), perms.end()); } offsets.push_back(polycubes.size()); - //backtrack_solve(&polycubes, &offsets); + auto spaces = std::vector(polycubes.size()); + std::transform(polycubes.begin(), polycubes.end(), spaces.begin(), [](auto i) { return i.space; }); + + auto solns = backtrack_solve(&spaces, &offsets); + + std::cout << solns << std::endl; return 0; }