#include "dynamic_grid.hpp" #include "clusters.hpp" #include "solver.hpp" #include "generator.hpp" #include "rules.hpp" #include #include #include #include #include #include int main(int argc, char** argv){ namespace po = boost::program_options; int w = 5; int h = 5; int c = 3; int explosion_size = 3; // Describe program options po::options_description opts; opts.add_options() ("w", po::value(&w), "width of puzzles") ("h", po::value(&h), "height of puzzles") ("c", po::value(&c), "number of colors") ("explosion_size", po::value(&explosion_size), "minimum explosion size") ("help", po::bool_switch(), "show this help"); // Parse and store them in a vm po::variables_map vm; po::store(po::parse_command_line(argc, argv, opts), vm); po::notify(vm); if(vm["help"].as()){ std::cout << "Puzzle Wuzzle Generator, version " << __DATE__ << std::endl; std::cout << opts << std::endl; return 0; } #define OUT(x) std::cout << #x << " = " << x << "\n" OUT(w); OUT(h); OUT(c); OUT(explosion_size); #undef OUT std::random_device rd; std::mt19937 gen(rd()); BasicRules rules(explosion_size); int count = 50000; int solvable = 0; int unsolvable = 0; while(--count){ auto field = random_dynamic_grid(w, h, c, gen); // std::cout << "\n= puzzle " << count << " =\n"; // field.print(std::cout); auto solution = solve(field, rules); if(!solution.solution_traces.empty()){ ++solvable; // std::cout << solution.solution_traces.size() << " solutions\n"; // for(auto&& t : solution.solution_traces[0]){ // std::cout << "(" << t.first << ", " << t.second << ")\n"; // } } else { ++unsolvable; // std::cout << "no solutions\n"; } } std::cout << solvable << " solvable\n"; std::cout << unsolvable << " unsolvable\n"; }